mybatis+mybatisplus源码学习(十三)MetaObject

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


前言

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;
    
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_lrs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值