Java 反射之私有字段和方法詳細介紹

jopen 11年前發布 | 26K 次閱讀 Java Java開發

本文將介紹Java 反射之私有字段和方法的應用,需呀了解的朋友可以參考下

</div>

盡管我們通常認為通過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差點吐血,私有的都能訪問了,還有什么安全可言?

不過了,有安全就有特權,所以由于能很好的解決問題還是被采納了

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!