一般來說,不可以訪問類的私人成員變數和調用類的私人方法。但通過Java Reflection API可以繞過這個限制,前面使用的getMethods, getFields,getConstructors 等方法都是返回的類的public 方法,類成員和建構函式。
本篇介紹如何使用Java Reflection API來訪問類的私人成員。
1. 訪問私人成員
Class的getDeclaredField(String name) 和getDeclaredFields 可以返回類的所有成員變數包括私人成員變數。
public class PrivateObject {</p><p> private String privateString = null;</p><p> public PrivateObject(String privateString) {<br /> this.privateString = privateString;<br /> }<br />}</p><p>....</p><p>PrivateObject privateObject = new PrivateObject("The Private Value");</p><p>Field privateStringField = PrivateObject.class.<br /> getDeclaredField("privateString");</p><p>privateStringField.setAccessible(true);</p><p>String fieldValue = (String) privateStringField.get(privateObject);<br />System.out.println("fieldValue = " + fieldValue);
上面代碼可以方法類PrivateObject的私人成員privateString。要注意的是privateStringField.setAccessible(true);
必須開啟類成員的存取控制後才可以訪問該私人成員。也只有使用Java Reflection API 才可以訪問類的私人成員。
2. 訪問類的私人方法
同樣Class的getDeclaredMethod(String name) 和getDeclaredMethods 可以用來訪問類額私人方法。
public class PrivateObject {</p><p> private String privateString = null;</p><p> public PrivateObject(String privateString) {<br /> this.privateString = privateString;<br /> }</p><p> private String getPrivateString(){<br /> return this.privateString;<br /> }<br />}</p><p>...<br />PrivateObject privateObject = new PrivateObject("The Private Value");</p><p>Method privateStringMethod = PrivateObject.class.<br /> getDeclaredMethod("getPrivateString", null);</p><p>privateStringMethod.setAccessible(true);</p><p>String returnValue = (String)<br /> privateStringMethod.invoke(privateObject, null);</p><p>System.out.println("returnValue = " + returnValue);
同樣需要調用privateStringMethod.setAccessible(true); 開啟對該私人方法的存取控制後才可訪問該私人成員方法。