# MyBatis 工具类 MetaObject 与 MetaClass

# MetaObject

MetaObject 是 MyBatis 反射工具类,通过 MetaObject 获取和设置对象的属性值

# MetaObject 主要方法

方法说明
hashGetter(name)判断是否有属性 name 或 name 的 getter 方法。<br /> 若定义 userId,没定义 getUserId () 方法,hasGetter ("userId") 则返回 true;<br /> 若定义方法 getUserId1 (),没定义属性 userId1,hasGetter ("userId1") 则返回 true。
getGetterNames()获取含有 getter 相关的属性名称。<br /> 若定义 userId,没定义 getUserId () 方法,则 userId 会被返回;<br /> 若定义方法 getUserId1 (),没定义属性 userId1, 则 userId1 会被返回。
getGetterType(name)获取 getter 方法的返回类型。
getValue(name)获取属性值。
hasSetter(name)判断是否有属性 name 或 name 的 setter 方法。<br /> 若定义 userId,没定义 setUserId (userId) 方法,hasSetter ("userId") 则返回 true;<br /> 若定义方法 setUserId1 (userId1),没定义属性 userId1,hasSetter ("userId1") 则返回 true。
getSetterNames()获取含有 setter 相关的属性名称。<br /> 若定义 userId,没定义 setUserId (userId) 方法,则 userId 会被返回;<br /> 若定义方法 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:获取 Person 列表中第一个 Person 的 personName

metaObject.getValue("persons[0].personName")

# 判断是否有 setter 方法

metaObject.hasSetter("companyName")

# 获取含有 setter 方法的属性名

metaObject.getSetterNames()

# 获取 setter 方法的参数类型

metaObject.getSetterType("companyName")

# 设置值

eg:将 Person 列表中第一个 Person 的 personName 设置为 "小马"

metaObject.setValue("persons[0].personName", "小马")

# MeataClass

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