目录
前言
Mybatis中提供了MetaObject,用来将一个对象的信息通过反射解析出来,保存了对象的元数据,可以通过ognl表达式设置和获取属性。
一、MetaObject的使用
(1)Object类型
可以对对象设置属性值和获取属性值。包括嵌套的属性
@Test
public void testObject() {
Student student = new Student(1L, "stu1", new Address("中国", "北京"));
MetaObject metaObject = SystemMetaObject.forObject(student);
Object name = metaObject.getValue("name");//获取属性值
System.out.println(name);
metaObject.setValue("name", "stu2");//设置属性值
name = metaObject.getValue("name");
System.out.println(name);
Object country = metaObject.getValue("address.country");//是哦那个ognl获取值
System.out.println(country);
}
(2)Collection类型
可以对集合添加元素,不能获取元素,获取方法会抛异常
@Test
public void testCollection() {
Student student1 = new Student(1L, "stu1", new Address("中国", "北京"));
Student student2 = new Student(2L, "stu2", new Address("中国", "上海"));
List<Student> students = new ArrayList<>();
students.add(student1);
MetaObject metaObject = SystemMetaObject.forObject(students);
metaObject.add(student2);//添加元素
System.out.println(students.size());
}
(3)Map类型
可以对map类型添加元素和获取元素
@Test
public void testMap() {
Student student1 = new Student(1L, "stu1", new Address("中国", "北京"));
Student student2 = new Student(2L, "stu2", new Address("中国", "上海"));
Map map = new HashMap();
map.put("student1", student1);
MetaObject metaObject = SystemMetaObject.forObject(map);
metaObject.setValue("student2", student2);//put
System.out.println(map.size());
System.out.println(metaObject.getValue("student2.name"));//get
}
二、MetaObject的原理
1、SystemMetaObject
public final class SystemMetaObject {
//默认对象工厂
public static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
//默认对象包装器工厂
public static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
//空对象的MetaObject
public static final MetaObject NULL_META_OBJECT = MetaObject.forObject(NullObject.class, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
private SystemMetaObject() {
// Prevent Instantiation of Static Class
}
private static class NullObject {
}
public static MetaObject forObject(Object object) {
return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
}
}
2、MetaObject的构建
(1)MetaObject
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
this.originalObject = object;

本文详细介绍了Mybatis中的MetaObject,用于反射解析对象信息。内容涵盖MetaObject的使用,如对象、集合和Map类型的属性操作,以及MetaObject的内部实现原理,包括SystemMetaObject、MetaObject构建、属性获取与设置等核心方法的解析。通过示例代码展示了如何利用MetaObject进行对象属性的动态操作。
最低0.47元/天 解锁文章
1791





