Java 反射之私有字段和方法詳細介紹
發佈:whsnow 字體:[
增長
減少] 類型:轉載
本文將介紹Java 反射之私有字段和方法的應用,需呀瞭解的朋友能夠參考下
儘管咱們一般認爲經過JAVA的反射機制來訪問其它類的私有字段和私有方法是可行的,其實並無那麼困難。
註釋:只有在單獨的JAVA程序中運行該代碼纔有效,就像你作一些單元測試或者常規的程序。若是你嘗試在JAVA APPLET內使用該方法,你須要稍稍修改SecurityManager。可是,由於你不是常常須要與它打交道,這裏也就再也不贅述了。
這裏是本次內容的列表:
1.訪問私有字段。
2.訪問私有方法。
訪問私有字段:
爲了訪問私有字段,你須要調用Class.getDeclaredField(String name)或者Class.getDeclaredFields()方法。方法Class.getField(String name)和Class.getFields()僅僅返回共有的字段,因此它們都沒法起到做用。這裏有一個例子,該例子中有一個包含私有字段的類,在該類下面有經過反射訪問私有字段的代碼。 安全
複製代碼代碼以下:
public class PrivateObject {
private String privateString = null; //聲明爲私有字段
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}
複製代碼代碼以下:
PrivateObject privateObject = new PrivateObject("The Private Value");//實例化對象
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//容許訪問私有字段
String fieldValue = (String) privateStringField.get(privateObject);//得到私有字段值
System.out.println("fieldValue = " + fieldValue);
這個代碼會打印出文本"fieldValue = The Private Value",而該值正好是對象PrivateObject的私有字段privateString的值。
注意到咱們使用了方法PrivateObject.class.getDeclaredfield("privateString")。正是這個調用這個方法返回了私有字段。這個方法僅僅根據指定的類返回字段,不會返回父類申明的字段。
另外仔細觀察加粗的語句。經過調用 Field.setAccessible(true),你關掉了對於這個指定字段實例的訪問檢查,僅僅對反射有效。如今你能訪問它了,無論它是私有的,保護的或是默認的(default),即時調用者並不在該範圍中。你仍然不能經過常規方法訪問該字段,由於編譯器不容許。
訪問私有方法
爲了訪問一個私有方法,你須要調用Class.getDeclaredMethod(String name,Class[] parameterTypes)或者Class.getDeclaredMethods()方法。方法Class.getMethod(String name,Class[] parameterTypes)和Class.getMethods()僅僅返回公有方法,因此它們不會起到做用。下面是一個簡單的例子,該例子中有一個擁有私有方法的類,類下面是經過反射機制訪問私有方法的代碼。
複製代碼代碼以下:
public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
private String getPrivateString(){//私有方法
return this.privateString;
}
}
複製代碼代碼以下:
PrivateObject privateObject = new PrivateObject("The Private Value");
Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
String returnValue = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
fields[i].setAccessible(true);這句主要是由於私有的變量在對象外是沒法訪問的,經過這個設置就能夠改變私有變量的訪問權,還真的有點恐怖,當偶把這個解決方法告訴Boss的時候,Boss差點吐血,私有的都能訪問了,還有什麼安全可言?
不過了,有安全就有特權,因此因爲能很好的解決問題仍是被採納了,嘻嘻~~~
單元測試