大家都知道Java類中的私有的(private)屬性是獲取不到的(即使使用繼承依然獲取不到),那如果非要獲取私有屬性的值怎么辦呢?一般的做法是將該java類封裝稱為一個JavaBean,即封裝該私有屬性,提供一對共有的get,set方法來訪問私有屬性。一般情況下都會這樣做!但遇到特殊情況呢?比如,先現有一個需求:訪問一個Java類的私有屬性,並且該類不提供訪問該私有屬性的共有方法!下面就為大家介紹一種方法訪問java類的私有屬性。
要獲取java類的私有屬性就不得不先介紹一個類PropertyDescriptor。該類為屬性描述符類。通過該類提供的一系列方法來訪問java類中的私有屬性。
下面看一段代碼:
BeanUtils.java
package yw.javaben; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; /** * 獲取私有屬性值JavaBean的幫助類 * @author yw-tony * */ public class BeanUtils { private PropertyDescriptor dp = null; private String propertyName; private Object obj; /** * 構造方法 * @param objName 屬性名稱 * @param obj 要操作的對象 */ public BeanUtils(String objName,Object obj){ try{ this.propertyName = objName; this.obj = obj; dp = new PropertyDescriptor(propertyName, obj.getClass()); }catch(Exception e){ e.printStackTrace(); } } /** * 獲取javabean私有屬性的值 * @return * @throws Exception */ public Object getProperty() throws Exception { //獲取對象屬性方法 Method method = dp.getReadMethod(); //獲取屬性對應的值 Object retValue = method.invoke(obj); return retValue; } /** * 設置私有屬性的值 * @param setValue * @throws Exception */ public void setProperty(Object setValue) throws Exception { Method method = dp.getWriteMethod(); method.invoke(obj, setValue); } }
BeanEntity.java
package yw.javaben; /** * 驗證屬性標識符的javabean * @author yw-tony * */ public class BeanEntity { private int x; private int y = 10; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
JavaBeanTest.java
public class JavaBeanTest { /** * 測試JavaBean * * @param args */ public static void main(String[] args) throws Exception { BeanEntity bean = new BeanEntity(); String x = "x";//BeanEntity的屬性名稱 BeanUtils utils = new BeanUtils(x, bean); utils.setProperty(12); Object value = utils.getProperty(); System.out.println(value); }
}