原文鏈接: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[]{"小馬"});
公眾號
喜歡我的文章,請關注公眾號