Mybatis常用工具类(三)-- MetaObject、MetaClass

iBit程序猿 2020年06月16日 2,942次浏览

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[]{"小马"});