通過PropertyDescriptor反射獲取屬性的 getter/setter 方法
阿新 • • 發佈:2019-02-20
Java類中的私有的(private)屬性是獲取不到的(即使使用繼承依然獲取不到),那如果非要獲取私有屬性的值怎麼辦呢?一般的做法是將該java類封裝稱為一個JavaBean,即封裝該私有屬性,提供一對共有的get,set方法來訪問私有屬性。一般情況下都會這樣做!但遇到特殊情況呢?比如,現有一個需求:訪問一個Java類的私有屬性,並且該類不提供訪問該私有屬性的共有方法。 比如說有些時候介面返回引數是Object範型別,但是實際我們是知道里面的實體型別,這個時候直接進行強制轉換即可。如下: ReturnData rd=newReturnData(); User obj=newUser();obj.setCustId(1L);rd.setObj(obj);User obj2= (User)rd.getObj(); System.out.println(obj2.getCustId()); 但如果我們拿到的Object不知道可以轉成什麼型別的bean,或者說是從其他系統拿到的obeject實體bean,而我們的系統中不存在這個bean的話,這時候java.beans.PropertyDescriptor類就有用武之地了, ReturnData rd=newReturnData();Userobj=newUser();obj.setCustId(1L);rd.setObj(obj); PropertyDescriptor descriptor = new PropertyDescriptor("custId", rd.getObj().getClass());//紅色是屬性名 Method readMethod = descriptor.getReadMethod(); Object invoke = readMethod.invoke(rd.getObj()); System.out.println(invoke); 這個屬性名一般是通訊雙方溝通得知,如果不知道屬性名,只能迴圈出所有的,具體方法看API。PropertyDescriptor類:PropertyDescriptor類表示JavaBean類通過儲存器匯出一個屬性。主要方法:
1. getReadMethod(),獲得用於讀取屬性值的方法 2. getWriteMethod(),獲得用於寫入屬性值的方法注:避免使用拼裝方法名,反射獲取Method物件。如tId,方法名格式與其他不統一,拼裝方法名會錯誤。實體類:package com.learn.pojo;public class person { private String tId; private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public String gettId() { return tId; } public void settId(String tId) { this.tId = tId; }}測試類:package com.learn.reflect;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import com.learn.pojo.person;public class ReflectDemo3 { public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { person p = new person(); p.setId("0"); PropertyDescriptor prop = new PropertyDescriptor("id", person.class); // 獲取getter方法,反射獲取id值 Object str = prop.getReadMethod().invoke(p); // 獲取setter方法,反射賦值 prop.getWriteMethod().invoke(p, "1"); System.out.println("獲取ID值:" + str); System.out.println("賦值ID:" + p.getId()); }}
1. getReadMethod(),獲得用於讀取屬性值的方法 2. getWriteMethod(),獲得用於寫入屬性值的方法注:避免使用拼裝方法名,反射獲取Method物件。如tId,方法名格式與其他不統一,拼裝方法名會錯誤。實體類:package com.learn.pojo;public class person { private String tId; private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public String gettId() { return tId; } public void settId(String tId) { this.tId = tId; }}測試類:package com.learn.reflect;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import com.learn.pojo.person;public class ReflectDemo3 { public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { person p = new person(); p.setId("0"); PropertyDescriptor prop = new PropertyDescriptor("id", person.class); // 獲取getter方法,反射獲取id值 Object str = prop.getReadMethod().invoke(p); // 獲取setter方法,反射賦值 prop.getWriteMethod().invoke(p, "1"); System.out.println("獲取ID值:" + str); System.out.println("賦值ID:" + p.getId()); }}