mybatis源码系列(七)—— 反射模块

首先看一下反射模块的核心类:
ObjectFactory:MyBatis每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建POJO;
ReflectorFactory:创建Reflector的工厂类,Reflector是MyBatis反射模块的基础,每个Reflector对象都对应一个类,在其中缓存了反射操作所需要的类元信息;
ObjectWrapper:对对象的包装,抽象了对象的属性信息,定义了一系列查询对象属性信息的方法,以及更新属性的方法;
ObjectWrapperFactory: ObjectWrapper 的工厂类,用于创建ObjectWrapper ;
MetaObject:封装了对象元信息,包装了MyBatis中五个核心的反射类。也是提供给外部使用的反射工具类,可以利用它可以读取或者修改对象的属性信息;
以上几个类对应的源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ObjectFactory、ObjectWrapperFactory和ReflectorFactory的默认值和初始化过程
在这里插入图片描述
这三个类在读取配置文件的过程中进行初始化
在这里插入图片描述
接着我们反射示例代码了解一下这些类是如何使用的:

//模拟MyBatis反射流程
ObjectFactory objectFactory = new DefaultObjectFactory();
//传入BaseTerm.class通过反射构造BaseTerm对象
BaseTerm baseTerm1 = objectFactory.create(BaseTerm.class);
ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();
ReflectorFactory reflectorFactory  = new DefaultReflectorFactory();
MetaObject metaObject = MetaObject.forObject(baseTerm1,objectFactory,objectWrapperFactory,reflectorFactory);

//模拟从数据库读取数据
Map<String,Object> result = new HashMap<>();
result.put("id",1L);
result.put("name","第一学期");
result.put("begin_time",new Date());
result.put("end_time",new Date());
result.put("sort",1);
result.put("rent_id",110L);
result.put("org_id",111L);
//2.模拟映射关系
Map<String, String> mapper = new HashMap<String, String>();
mapper.put("id", "id");
mapper.put("name", "name");
mapper.put("beginTime", "begin_time");
mapper.put("endTime", "end_time");
mapper.put("sort", "sort");
mapper.put("rentId", "rent_id");
mapper.put("orgId", "org_id");

//获取BeanWrapper,既包括类元数据,同时还能对对象的属性赋值
BeanWrapper objectWrapper = (BeanWrapper) metaObject.getObjectWrapper();

Set<Map.Entry<String, String>> entrySet = mapper.entrySet();
//遍历映射关系
for (Map.Entry<String, String> colInfo : entrySet) {
  String propName = colInfo.getKey();//获得pojo的字段名称
  Object propValue = result.get(colInfo.getValue());//模拟从数据库中加载数据对应列的值
  PropertyTokenizer proTokenizer = new PropertyTokenizer(propName);
  objectWrapper.set(proTokenizer, propValue);//将数据库的值赋值到pojo的字段中
}
System.out.println(metaObject.getOriginalObject());

构造BeanWrapper的流程(读取实体类相关信息流程):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中获取属性方法的源码为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SetFieldInvoker和GetFieldInvoker源码:
在这里插入图片描述
在这里插入图片描述
最好类的相关信息都保存在Reflector对象中
在这里插入图片描述
赋值到实体类的流程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获取set方法流程,可以是看到从之前的保存的set方法集合中获取出来的:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值