测试代码
@Testpublic void test7(){ReflectorFactory reflectorFactory = new DefaultReflectorFactory();MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);System.out.println(meta.hasGetter("richField"));System.out.println(meta.hasGetter("richProperty"));System.out.println(meta.hasGetter("richList"));System.out.println(meta.hasGetter("richMap"));System.out.println(meta.hasGetter("richList[0]"));System.out.println(meta.hasGetter("richType"));System.out.println(meta.hasGetter("richType.richField"));System.out.println(meta.hasGetter("richType.richProperty"));System.out.println(meta.hasGetter("richType.richList"));System.out.println(meta.hasGetter("richType.richMap"));System.out.println(meta.hasGetter("richType.richList[0]"));// findProperty 智能处理 . 的表达式System.out.println(meta.findProperty("richType.richProperty"));System.out.println(meta.findProperty("richType.richProperty1"));System.out.println(meta.findProperty("richList[0]"));System.out.println(Arrays.toString(meta.getGetterNames()));}
输出结果
truetruetruetruetruetruetruetruetruetruetruerichType.richPropertyrichType.null[richType, richProperty, richMap, richList, richField]
5 MetaObject 我们可以通过MetaObject对象解析复杂的表达式来对提供的对象进行操作 。具体的通过案例来演示会更直观些
@Testpublic void shouldGetAndSetField() {RichType rich = new RichType();MetaObject meta = SystemMetaObject.forObject(rich);meta.setValue("richField", "foo");System.out.println(meta.getValue("richField"));}@Testpublic void shouldGetAndSetNestedField() {RichType rich = new RichType();MetaObject meta = SystemMetaObject.forObject(rich);meta.setValue("richType.richField", "foo");System.out.println(meta.getValue("richType.richField"));}@Testpublic void shouldGetAndSetMAppairUsingArraySyntax() {RichType rich = new RichType();MetaObject meta = SystemMetaObject.forObject(rich);meta.setValue("richMap[key]", "foo");System.out.println(meta.getValue("richMap[key]"));}
以上三个方法的输出结果都是
foo
6 反射模块应用 然后我们来看下在MyBatis的核心处理层中的实际应用
6.1 SqlSessionFactory
在创建SqlSessionFactory操作的时候会完成Configuration对象的创建 , 而在Configuration中默认定义的ReflectorFactory的实现就是DefaultReflectorFactory对象
文章插图
然后在解析全局配置文件的代码中 , 给用户提供了ReflectorFactory的扩展 , 也就是我们在全局配置文件中可以通过<reflectorFactory>标签来使用我们自定义的ReflectorFactory
6.2 SqlSession
? 无相关操作
6.3 Mapper
? 无相关操作
6.4 执行SQL
? 在Statement获取结果集后 , 在做结果集映射的使用有使用到 , 在DefaultResultSetHandler的createResultObject方法中 。
文章插图
然后在DefaultResultSetHandler的getRowValue方法中在做自动映射的时候
文章插图
继续跟踪 , 在createAutomaticMappings方法中
文章插图
当然还有很多其他的地方在使用反射模块来完成的相关操作 , 这些可自行查阅
好了-反射模块我们就给大家介绍到这里 , 如果有问题欢迎留言交流 , 欢迎大家点赞关注
【reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱】
推荐阅读
- 一篇文章带你搞懂Python中的类
- 软件测试知识点3大场景带你了解单元测试
- 彻底搞懂虚拟地址翻译为物理地址的过程
- 彻底搞懂虚拟内存,虚拟地址,虚拟地址空间
- 小青柑茶多少钱盒,小青柑是什么茶带你全面了解小青柑
- 如何彻底搞懂Mysql事务原理
- 桃花治便秘最彻底的偏方法,桃花的功效与作用
- 帮你彻底搞懂 JS 中的 prototype、__proto__与constructor
- 15张图表带你速览2021人工智能最新趋势
- 电池|一季度动力电池装机量排行榜:宁德时代彻底无敌 以一打十