然后我们来看看它的具体实现
2.2 DefaultReflectorFactory
? MyBatis只为该接口提供了DefaultReflectorFactory这一个实现类 。他与Reflector的关系如下
文章插图
DefaultReflectorFactory中的实现 , 代码比较简单 , 我们直接贴出来
public class DefaultReflectorFactory implements ReflectorFactory {private boolean classCacheEnabled = true;// 实现对 Reflector 对象的缓存private final ConcurrentMap<Class<?>, Reflector> reflectorMap = new ConcurrentHashMap<>();public DefaultReflectorFactory() {}@Overridepublic boolean isClassCacheEnabled() {return classCacheEnabled;}@Overridepublic void setClassCacheEnabled(boolean classCacheEnabled) {this.classCacheEnabled = classCacheEnabled;}@Overridepublic Reflector findForClass(Class<?> type) {if (classCacheEnabled) {// 开启缓存// synchronized (type) removed see issue #461return reflectorMap.computeIfAbsent(type, Reflector::new);} else {// 没有开启缓存就直接创建return new Reflector(type);}}}2.3 使用演示
通过上面的介绍 , 我们可以具体的来使用下 , 加深对其的理解,先准备一个JavaBean , package com.gupaoedu.domain;public class Student {public Integer getId() {return 6;}public void setId(Integer id) {System.out.println(id);}public String getUserName() {return "张三";}}
这个Bean我们做了简单的处理@Testpublic void test02() throws Exception{ReflectorFactory factory = new DefaultReflectorFactory();Reflector reflector = factory.findForClass(Student.class);System.out.println("可读属性:"+Arrays.toString(reflector.getGetablePropertyNames()));System.out.println("可写属性:"+Arrays.toString(reflector.getSetablePropertyNames()));System.out.println("是否具有默认的构造器:" + reflector.hasDefaultConstructor());System.out.println("Reflector对应的Class:" + reflector.getType());}
文章插图
3 Invoker 针对于Class中Field和Method的调用 , 在MyBatis中封装了Invoker对象来统一处理(有使用到适配器模式)
3.1 接口说明
/** * @author Clinton Begin */public interface Invoker {// 执行Field或者MethodObject invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;// 返回属性相应的类型Class<?> getType();}
该接口有对应的三个实现文章插图
3.2 效果演示
使用效果演示 , 还是通过上面的案例来介绍
package com.gupaoedu.domain;public class Student {public Integer getId() {System.out.println("读取id");return 6;}public void setId(Integer id) {System.out.println("写入id:"+id);}public String getUserName() {return "张三";}}
测试代码public void test03() throws Exception{ReflectorFactory factory = new DefaultReflectorFactory();Reflector reflector = factory.findForClass(Student.class);// 获取构造器 生成对应的对象Object o = reflector.getDefaultConstructor().newInstance();MethodInvoker invoker1 = (MethodInvoker) reflector.getSetInvoker("id");invoker1.invoke(o,new Object[]{999});// 读取Invoker invoker2 = reflector.getGetInvoker("id");invoker2.invoke(o,null);}
效果
文章插图
4 MetaClass 在Reflector中可以针对普通的属性操作 , 但是如果出现了比较复杂的属性 , 比如 private Person person; 这种 , 我们要查找的表达式 person.userName.针对这种表达式的处理 , 这时就可以通过MetaClass来处理了 。我们来看看主要的属性和构造方法
/** * 通过 Reflector 和 ReflectorFactory 的组合使用 实现对复杂的属性表达式的解析 * @author Clinton Begin */public class MetaClass {// 缓存 Reflectorprivate final ReflectorFactory reflectorFactory;// 创建 MetaClass时 会指定一个Class reflector会记录该类的相关信息private final Reflector reflector;private MetaClass(Class<?> type, ReflectorFactory reflectorFactory) {this.reflectorFactory = reflectorFactory;this.reflector = reflectorFactory.findForClass(type);}// ....}
效果演示 , 准备Bean对象package com.gupaoedu.domain;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class RichType {private RichType richType;private String richField;private String richProperty;private Map richMap = new HashMap();private List richList = new ArrayList() {{add("bar");}};public RichType getRichType() {return richType;}public void setRichType(RichType richType) {this.richType = richType;}public String getRichProperty() {return richProperty;}public void setRichProperty(String richProperty) {this.richProperty = richProperty;}public List getRichList() {return richList;}public void setRichList(List richList) {this.richList = richList;}public Map getRichMap() {return richMap;}public void setRichMap(Map richMap) {this.richMap = richMap;}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 一篇文章带你搞懂Python中的类
- 软件测试知识点3大场景带你了解单元测试
- 彻底搞懂虚拟地址翻译为物理地址的过程
- 彻底搞懂虚拟内存,虚拟地址,虚拟地址空间
- 小青柑茶多少钱盒,小青柑是什么茶带你全面了解小青柑
- 如何彻底搞懂Mysql事务原理
- 桃花治便秘最彻底的偏方法,桃花的功效与作用
- 帮你彻底搞懂 JS 中的 prototype、__proto__与constructor
- 15张图表带你速览2021人工智能最新趋势
- 电池|一季度动力电池装机量排行榜:宁德时代彻底无敌 以一打十