1. 程式人生 > >通過PropertyDescriptor反射獲取屬性的 getter/setter 方法

通過PropertyDescriptor反射獲取屬性的 getter/setter 方法

          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());    }}