Mybatis反射核心类Reflector

Reflector类负责对一个类进行反射解析,并将解析后的结果在属性中存储起来。

一个类反射解析后都有哪些属性呢?我们可以通过Reflector类定义的属性来查看

public class Reflector {// 要被反射解析的类private final Class<?> type;// 可读属性列表即有get方法的属性列表private final String[] readablePropertyNames;// 可写属性列表即有set方法的属性列表private final String[] writeablePropertyNames;// set方法映射表。键为属性名,值为对应的set方法private final Map<String, Invoker> setMethods = new HashMap<String, Invoker>();// get方法映射表。键为属性名,值为对应的get方法private final Map<String, Invoker> getMethods = new HashMap<String, Invoker>();// set方法输入参数类型映射表。键为属性名,值为对应set方法输入参数类型的Classprivate final Map<String, Class<?>> setTypes = new HashMap<String, Class<?>>();// get方法返回值类型映射表。键为属性名,值为对应get方法返回值类型的Classprivate final Map<String, Class<?>> getTypes = new HashMap<String, Class<?>>();// 默认构造器private Constructor<?> defaultConstructor;// 忽略大小写的属性映射表。键为属性名全大写值,值为属性名private Map<String, String> caseInsensitivePropertyMap = new HashMap<String, String>();// Reflector类反射解析一个类的过程是由构造函数触发的public Reflector(Class<?> clazz) {// 记录被反射解析的类type = clazz;// 解析默认造方法addDefaultConstructor(clazz);// 解析所有的getteraddGetMethods(clazz);// 解析所有的setteraddSetMethods(clazz);// 解析所有属性addFields(clazz);// 获取可读属性列表readablePropertyNames = getMethods.keySet().toArray(new String[getMethods.keySet().size()]);// 获取可写属性列表writeablePropertyNames = setMethods.keySet().toArray(new String[setMethods.keySet().size()]);// 获取忽略大小写的属性列表for (String propName : readablePropertyNames) {caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName);}for (String propName : writeablePropertyNames) {caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName);}}.....
}

创建方式:

1、直接new
Reflector reflector = new Reflector(User.class);
2、工厂创建
ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
Reflector reflector = reflectorFactory.findForClass(User.class);

对外暴露的方法:

Reflector reflector = new Reflector(User.class);
// 获取被解析反射的类
Class<?> type = reflector.getType();
// 根据属性名获取对应的set方法
Invoker setInvoker = reflector.getSetInvoker("name");
// 根据属性名获取对应的get方法
Invoker getInvoker = reflector.getGetInvoker("name");
// 获取所有可读属性列表
String[] getablePropertyNames = reflector.getGetablePropertyNames();
// 获取所有可写属性列表
String[] setablePropertyNames = reflector.getSetablePropertyNames();
// 获取默认构造器
Constructor<?> defaultConstructor = reflector.getDefaultConstructor();
// 根据属性名获取对应get方法返回值类型
Class<?> getterType = reflector.getGetterType("name");
// 根据属性名获取对应set方法参数类型
Class<?> setterType = reflector.getSetterType("name");
// 根据属性名不区分大小写获取属性名
String name = reflector.findPropertyName("name");
// 判断属性是否存在getter方法
boolean hasGetter = reflector.hasGetter("name");
// 判断属性是否存在getter方法
boolean hasSetter = reflector.hasSetter("name");

测试案例:

    @Testpublic void test1()throws Exception{Reflector reflector = new Reflector(User.class);Class<?> type = reflector.getType();System.out.println("要被反射解析的类:"+type);Constructor<?> defaultConstructor = reflector.getDefaultConstructor();System.out.println(defaultConstructor);String[] getablePropertyNames = reflector.getGetablePropertyNames();for (String propertyName : getablePropertyNames) {System.out.println("可读属性:"+propertyName);}System.out.println("----------------------------------------------------------");String[] setablePropertyNames = reflector.getSetablePropertyNames();for (String propertyName : setablePropertyNames) {System.out.println("可写属性:"+propertyName);}System.out.println("--------------------------------------------------");for (String propertyName : reflector.getGetablePropertyNames()) {Invoker name = reflector.getGetInvoker(propertyName);Object invoke = name.invoke(new User(), null);System.out.println("执行属性"+propertyName+"的get方法:"+invoke);}}

测试结果:
在这里插入图片描述

该类里面还有一个值的注意的小工具类可以直接拿来使用,生成方法签名

  private String getSignature(Method method) {StringBuilder sb = new StringBuilder();Class<?> returnType = method.getReturnType();if (returnType != null) {sb.append(returnType.getName()).append('#');}sb.append(method.getName());Class<?>[] parameters = method.getParameterTypes();for (int i = 0; i < parameters.length; i++) {if (i == 0) {sb.append(':');} else {sb.append(',');}sb.append(parameters[i].getName());}return sb.toString();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带你用uniapp从零开发一个仿小米商场_6. 配置uniapp项目底部导航栏tabbar

uniapp底部tabbar介绍 在uni-app中&#xff0c;底部tabbar是一种常见的导航方式&#xff0c;它可以让用户在应用的不同页面之间进行切换。通过tabBar配置项&#xff0c;开发者可以指定一级导航栏和tab切换时显示的对应页。 在底部tabbar中&#xff0c;每个tab都有一个页面路径…

虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!

引言&#xff1a;探索AR的神奇世界&#xff0c;我们将从二维码的诞生谈起。在这个科技的海洋中&#xff0c;二维码是如何帮助AR实现数据获取与位姿识别的呢&#xff1f;让我们一起揭开这层神秘的面纱&#xff01; 一、二维码的由来 二维码是将数据存储在图形中的技术&#xff…

Python | CAP - 累积精度曲线分析案例

CAP通常被称为“累积精度曲线”&#xff0c;用于分类模型的性能评估。它有助于我们理解和总结分类模型的鲁棒性。为了直观地显示这一点&#xff0c;我们在图中绘制了三条不同的曲线&#xff1a; 一个随机的曲线&#xff08;random&#xff09;通过使用随机森林分类器获得的曲线…

Gee教程1.HTTP基础

标准库启动web服务 Go语言内置了 net/http库&#xff0c;封装了HTTP网络编程的基础的接口。这个Web 框架便是基于net/http的。我们先回顾下这个库的使用。 package mainimport ("fmt""log""net/http" )func main() {//可以写成匿名函数(lambda…

【数据结构初阶】树,二叉树

树&#xff0c;二叉树 1.树概念及结构1.1树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构2.1概念2.2现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 1.树概念及结构 1.…

STM32-SPI3控制MCP3201、MCP3202(Sigma-Delta-ADC芯片)

STM32-SPI3控制MCP3201、MCP3202&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能数字输出编码与实值的转换分辨率设置与LSB最小和最大输出代码&#xff08;注&#xff09; 正负符号寄存器位MSB数字输出编码数据转换的LSB值 将设备输出编码转换为…

SQL JOIN 子句:合并多个表中相关行的完整指南

SQL JOIN JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。 让我们看一下“Orders”表的一部分选择&#xff1a; OrderIDCustomerIDOrderDate1030821996-09-1810309371996-09-1910310771996-09-20 然后&#xff0c;看一下“Customers”表的一部分选择&#xff…

单片机学习5——外部中断程序

#include<reg52.h>unsigned char a; sbit lcden P3^4;void main() {lcden0;EA1;EX01;IT00;a0xF0; //点亮4位小灯while(1){P1a;} }//中断服务程序 void ext0() interrupt 0 // 0 表示的是外部中断源0 {a0x0f; // 中断处理完&#xff0c;再返回主…

2018年10月4日 Go生态洞察:参与2018年Go公司问卷调查

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

系列十八、Spring bean线程安全问题

一、概述 我们知道Spring中的bean&#xff0c;默认情况下是单例的&#xff0c;那么Spring中的bean是线程安全的吗&#xff1f;这个需要分情况考虑&#xff0c;bean中是否存在成员变量&#xff1f;bean中的成员变量是怎么处理的&#xff1f;...&#xff0c;针对bean的状态会有不…

【C++】类和对象——拷贝构造和赋值运算符重载

上一篇我们讲了构造函数&#xff0c;就是对象实例化时会自动调用&#xff0c;那么&#xff0c;我们这里的拷贝构造在形式上是构造函数的一个重载&#xff0c;拷贝构造其实也是一种构造函数&#xff0c;那么我们就可以引出这里的规则 1.拷贝构造函数的函数名必须与类名相同。 2.…

数据结构——带头循环双向链表(List)

1、带头双向循环链表介绍 在上一篇博客中我们提到了链表有三个特性&#xff0c;可以组合成为8种不同类型的链表。单链表是其中比较重要的一种&#xff0c;那么这次我们选择和带头双向循环链表会会面&#xff0c;这样我们就见识过了所有三种特性的呈现。 带头双向循环链表&#…

HONOR荣耀MagicBook 15 2021款 锐龙版R5(BMH-WFQ9HN)原厂Windows11预装OEM系统含F10智能还原

链接&#xff1a;https://pan.baidu.com/s/1faYtC5BIDC2lsV_JSMI96A?pwdj302 提取码&#xff1a;j302 原厂系统Windows11.22H2工厂模式安装包,含F10一键智能还原&#xff0c;自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、荣耀 电脑管家等预装程序 …

process control 化学工程 需要用到MATLAB的Simulink功能

process control 化学工程 需要用到MATLAB的Simulink功能 所有问题需要的matlab simulink 模型 WeChat: ye1-6688 The riser tube brings in contact the recirculating catalyst with the feed oil, which then vaporizes and splits to lighter components as it flows up th…

服务器下db(数据库)的执行

1、查看 select * from xxxx&#xff08;表名&#xff09; where xxx&#xff08;列表&#xff09;1 and.......正常写就行 2、插入 如果你想要在 SELECT INSERT INTO … SELECT 语句中将部分列保持不变,只改变一两列的值,可以在 语句中直接设置目标列的值,而其他列从源表中…

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )

文章目录 一、重新解释类型转换 reinterpret_cast1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )3、指针数据类型转换 - C 静态类型转换 static_cast ( 转换失败 )4、指针数据类型转换 - C 重新解释类型…

Simulink 的代数环

代数环, 就是由于模型的输出反馈到模块或子系统先的某个输入端, 如果这个输入是直接馈入的, 那么二者在同一个采样点内需得到求解, 但又互相依赖, 哪一方都不能完成求解过程, 使得解算器无法解算导致错误产生, 这样的情况称为代数环。 一旦 Simulink 遇到代数环, 将根据 Confi…

python环境搭建-yolo代码跑通-呕心沥血制作(告别报错no module named torch)

安装软件 安装过的可以查看有没有添加环境变量 好的! 我们发车! 如果你想方便快捷的跑通大型项目,那么必须安装以下两个软件: 1.pycharm2.anaconda对应作用: pycharm:专门用来跑通python项目的软件,相当于一个编辑器,可以debug调试,可以接受远程链接调试!anaconda:专…

2023年初中生古诗文大会复选最后6天备考策略和更新的在线模拟题

今天是2023年11月26日&#xff0c;星期日&#xff0c;距离2023年第八届上海市中学生古诗文大会复选&#xff08;复赛&#xff09;还有六天&#xff08;2023年12月2日上午举办&#xff09;&#xff0c;相信各位晋级的小学霸们正在繁忙的学业之余抓紧备考。 为了帮助孩子们更有效…

thinkphp最新开发的物业管理系统 缴费管理、停车管理、收费管理、值班管理

物业费&#xff0c;水电燃气费&#xff0c;电梯费&#xff0c;租金&#xff0c;临时收费等多种收费规则完全自定义&#xff0c;账单自动生成&#xff0c;无需人工计算 实时数据互通&#xff1a;一键报事报修&#xff0c;购买车辆月卡&#xff0c;管理家人信息&#xff0c;参加物…