reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱( 三 )

 
测试代码
@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]"));}以上三个方法的输出结果都是
foo6 反射模块应用  然后我们来看下在MyBatis的核心处理层中的实际应用
6.1 SqlSessionFactory
  在创建SqlSessionFactory操作的时候会完成Configuration对象的创建 , 而在Configuration中默认定义的ReflectorFactory的实现就是DefaultReflectorFactory对象

reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
  然后在解析全局配置文件的代码中 , 给用户提供了ReflectorFactory的扩展 , 也就是我们在全局配置文件中可以通过<reflectorFactory>标签来使用我们自定义的ReflectorFactory
6.2 SqlSession
? 无相关操作
6.3 Mapper
? 无相关操作
6.4 执行SQL
? 在Statement获取结果集后 , 在做结果集映射的使用有使用到 , 在DefaultResultSetHandler的createResultObject方法中 。
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
然后在DefaultResultSetHandler的getRowValue方法中在做自动映射的时候
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
继续跟踪 , 在createAutomaticMappings方法中
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
当然还有很多其他的地方在使用反射模块来完成的相关操作 , 这些可自行查阅
好了-反射模块我们就给大家介绍到这里 , 如果有问题欢迎留言交流 , 欢迎大家点赞关注

【reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱】


推荐阅读