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


原文鏈接: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[]{"小馬"});

公眾號

喜歡我的文章,請關注公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM