Mybatis的反射

本文探讨了Mybatis中反射的应用,重点介绍了ObjectFactory、Reflector、ReflectorFactory、ObjectWrapper和MetaObject的角色。ObjectFactory负责通过XML配置创建对象,Reflector作为反射核心,即使面对private属性也能进行操作。ReflectorFactory生成Reflector,而BeanWrapper和MetaObject则提供了对象属性赋值和反射操作的接口。Mybatis的反射机制展示了其强大的暴力反射能力,能够自动为无setter/getter的方法生成相应功能。
摘要由CSDN通过智能技术生成

  我们都知道Mybatis是ORM框架,主要是实现数据库字段和Java对象的映射,其中用到的就是反射。Mybatis的反射是一个特别强大的模块。
  Mybatis的反射这里主要介绍ObjectFactory,Reflector,ReflectorFactory,ObjectWrapper,MetaObject

一:ObjectFactory
  ObjectFactory主要提供了create方法,通过mapper.xml里面的对象路径反射生成对象。DefaultObjectFactory继承了ObjectFactory重载了create方法,具体实现反射的细节。

public class DefaultObjectFactory implements ObjectFactory, Serializable {
   

  private static final long serialVersionUID = -8855120656740914948L;

  @Override
  public <T> T create(Class<T> type) {
   
    return create(type, null, null);
  }

  @SuppressWarnings("unchecked")
  @Override
  public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
   
	//判断类是不是集合类,如果是集合类指定具体的实现类
    Class<?> classToCreate = resolveInterface(type);
    // we know types are assignable
    return (T) instantiateClass(classToCreate, constructorArgTypes, constructorArgs);
  }

二:Reflector是反射的核心类,里面定义了type属性保存对应的class以及用来保存对象中可读(有get方法),可写(有set方法)属性的数组,保存set,get方法和set的入参类型,get的返回类型的Map。在Mybatis启动时,会将对象的属性全部加载到Reflector中。

public class Reflector {
   

  private final Class<?> type;//对应的class
  private final String[] readablePropertyNames;//可读属性的名称集合,存在get方法即可读
  private final String[] writeablePropertyNames;//可写属性的名称集合,存在set方法即可写
  private final Map<String, Invoker> setMethods = new HashMap<>();//保存属性相关的set方法
  private final Map<String, Invoker> getMethods = new HashMap<>();//保存属性相关的get方法
  private final Map<String, Class<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值