我们都知道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<