介绍
Mybatis中与反射有关的类主要在 org.apache.ibatis.reflection 包下,主要涉及以下几个方面
- 对象的创建 -> ObjectFactory
- 类的Class对象解析 -> Reflector
- 对象字段值的设置和相关信息的获取 -> MetaObject
反射的基础知识可以参考这篇文章:https://blog.csdn.net/weixin_45341408/article/details/109902262
ObjectFactory对象的创建
首先看看java中有哪些创建对象的方式:
- 通过new的方式,但是有个必要条件就是,使用new的时候当前对象已经存在了
- Class.newInstance和Constructor.newInstance,通过反射创建对象
- 通过对象的clone方法创建对象,但是有几个约定,具体参考Object类clone方法上的注释(浅拷贝)
- 反序列化创建对象,参见Serializable接口的注释(深拷贝)
- Unsafe.allocateInstance,直接为对象分配内存空间,绕过了构造器的调用,这个实在是太霸道了,不推荐使用
再来看看ObjectFactory接口中有哪些方法:
//mybatis使用ObjectFactory 创建所有所需的新对象
public interface ObjectFactory {
//这个方法用于自定义ObjectFactory接口实现类时传递的参数,稍后介绍
default void setProperties(Properties properties) {
// NOP
}
//使用无参构造器创建对象
<T> T create(Class<T> type);
//使用指定参数的构造器创建对象
<T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
//判断指定类型是否是集合类型
<T> boolean isCollection(Class<T> type);
}
介绍ObjectFactory#setProperties(Properties)方法:
我们可以在mybatis-config.xml配置文件中指定自定义的ObjectFactory接口实现类,同时指定一些额外属性信息:
<configuration>
<objectFactory type="com.xxx.MyObjectFactory">
<property name="name" value="zs"/>
<property name="age" value="18"/>
</objectFactory>
</configuration>
mybatis在解析完<objectFactory>标签后会把子标签<property>封装成一个Properti