property工具包简介
org.apache.ibatis.reflection.property包下共有三个工具类,PropertyCopier、PropertyNamer和PropertyTokenizer。
- PropertyCopier:主要用于两个对象之间进行属性复制
- PropertyNamer:主要用于完成属性名和方法名之间的转换
- PropertyTokenizer:主要用于解析属性表达式,比如在mapper.xml中经常写的
<if test="order.orderName != null && order.orderName != ''">
......
</if>
这里的order.orderName就是属性表达式而PropertyTokenizer工具类的作用就是解析属性表达式
PropertyCopier
属性复制器只有一个方法copyBeanProperties(Class<?> type, Object sourceBean, Object destinationBean),该方法的功能是通过递归的方法将sourceBean对象中的属性复制到destinationBean对象中,包括sourceBean和destinationBean的父对象中的属性
//final修饰,不允许进行扩展或修改。
public final class PropertyCopier {
private PropertyCopier() {
}
public static void copyBeanProperties(Class<?> type, Object sourceBean, Object destinationBean) {
Class<?> parent = type;
while (parent != null) {
//递归退出条件
final Field[] fields = parent.getDeclaredFields();//获取当前类声明的所有字段
for (Field field : fields) {
try {
try {
//将sourceBean中的该字段的值赋给destinationBean中对应的字段
field.set(destinationBean, field.get(sourceBean));
} catch (IllegalAccessException e) {
if (Reflector.canControlMemberAccessible()) {
field.setAccessible(