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

  然后我们来看看它的具体实现
2.2 DefaultReflectorFactory
? MyBatis只为该接口提供了DefaultReflectorFactory这一个实现类 。他与Reflector的关系如下

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

文章插图
 
  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());}
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
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();}  该接口有对应的三个实现
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
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);} 
效果
reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱

文章插图
 
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;}}


推荐阅读