原文链接:Mybatis常用工具类(三)-- MetaObject、MetaClass
MetaObject
MetaObject 是 Mybatis 反射工具类,通过 MetaObject 获取和设置对象的属性值。
MetaObject 主要方法
方法 | 说明 |
---|---|
hasGetter(name) | 判断是否有属性 name 或 name 的 getter 方法。 1. 若定义 userId,没定义 getUserId() 方法,hasGetter("userId") 则返回 true; 2. 若定义方法 getUserId1(),没定义属性 userId1,hasGetter("userId1") 则返回 true。 |
getGetterNames() | 获取含有 getter 相关的属性名称。 1. 若定义 userId,没定义 getUserId() 方法,则 userId 会被返回; 2. 若定义方法 getUserId1(),没定义属性 userId1, 则 userId1 会被返回。 |
getGetterType(name) | 获取 getter 方法的返回类型。 |
getValue(name) | 获取属性值。 |
hasSetter(name) | 判断是否有属性 name 或 name 的 setter 方法。 1. 若定义 userId,没定义 setUserId(userId) 方法,hasSetter("userId") 则返回 true; 2. 若定义方法 setUserId1(userId1),没定义属性 userId1,hasSetter("userId1") 则返回 true。 |
getSetterNames() | 获取含有 setter 相关的属性名称。 1. 若定义 userId,没定义 setUserId(userId) 方法,则 userId 会被返回; 2. 若定义方法 setUserId1(userId1),没定义属性 userId1, 则 userId1 会被返回。 |
getSetterType(name) | 获取 setter 方法的参数类型。 |
setValue(name, value) | 设置属性值。 |
备注
- 跟 getter 相关的 name,为属性名称 或 isXXX()/getXXX() 中的 xXX 部分(首字母小写)
- 跟 setter 相关的 name,为属性名称 或 setXXX() 中的 xXX 部分(首字母小写)
相关例子
接下来我们通过例子讲解如何通过 MetaObject 获取和设置对象属性。
创建一个 MetaObject 对象
MetaObject metaObject = SystemMetaObject.forObject(company);
判断是否有 getter 方法
metaObject.hasGetter("companyName")
获取含有 getter 方法的属性名
metaObject.getGetterNames()
获取 getter 方法的返回类型
metaObject.getGetterType("companyName")
获取值
eg: 获取 Persons 列表中第一个 Person 的 personName
metaObject.getValue("persons[0].personName")
判断是否有 setter 方法
metaObject.hasSetter("companyName")
获取含有 setter 方法的属性名
metaObject.getSetterNames()
获取 setter 方法的参数类型
metaObject.getSetterType("companyName")
设置值
eg: 将 Persons 列表中第一个 Person 的 personName 设置为 "小马"
metaObject.setValue("persons[0].personName", "小马")
MetaClass
与 MetaObject 不同的是,MetaObject 用于获取和设置对象的属性值,而 MetaClass 则用于获取类相关的信息。
MetaClass 主要方法
方法 | 说明 |
---|---|
静态方法 forClass(type, reflectorFactory) | 创建 MetaClass 对象 |
hasDefaultConstructor() | 判断是否有默认构造方法 |
hasGetter(name) | 判断是否有属性 name 或 name 的 getter 方法。与 MetaObject 判断类似。 |
getGetterNames() | 获取含有 getter 相关的属性名称。与 MetaObject 判断类似。 |
getGetInvoker(name) | name 的 getter 方法的 Invoker。 |
hasSetter(name) | 判断是否有属性 name 或 name 的 setter 方法。与 MetaObject 判断类似。 |
getSetterNames() | 获取含有 setter 相关的属性名称。与 MetaObject 判断类似。 |
getSetterType(name) | 获取 setter 方法的参数类型。与 MetaObject 判断类似。 |
getSetInvoker(name) | name 的 setter 方法的 Invoker。 |
备注
- 跟 getter 相关的 name,为属性名称 或 isXXX()/getXXX() 中的 xXX 部分(首字母小写)
- 跟 setter 相关的 name,为属性名称 或 setXXX() 中的 xXX 部分(首字母小写)
相关例子
创建一个 MetaClass 对象
MetaClass metaClass = MetaClass.forClass(Person.class, new DefaultReflectorFactory());
判断是否有默认构造方法
metaClass.hasDefaultConstructor()
判断是否有 getter 方法
metaClass.hasGetter("personName")
获取含有 getter 方法的属性名
metaClass.getGetterNames()
获取 getter 方法的返回类型
metaClass.getGetterType("personName")
获取值
eg: person 的 personName
Invoker invoker = metaClass.getGetInvoker("personName");
Object personName = invoker.invoke(person, null);
判断是否有 setter 方法
metaClass.hasSetter("personName")
获取含有 setter 方法的属性名
metaClass.getSetterNames()
获取 setter 方法的参数类型
metaClass.getSetterType("personName")
设置值
eg: person 的 personName 设置为 "小马"
Invoker invoker = metaClass.getSetInvoker("personName");
invoker.invoke(person, new String[]{"小马"});
公众号
喜欢我的文章,请关注公众号