Java 反射之私有字段和方法詳細介紹
更新時間:2012年11月26日 12:08:19 作者:
本文將介紹Java 反射之私有字段和方法的應用,需呀了解的朋友可以參考下
盡管我們通常認為通過JAVA的反射機制來訪問其它類的私有字段和私有方法是可行的,其實并沒有那么困難。
注釋:只有在單獨的JAVA程序中運行該代碼才有效,就像你做一些單元測試或者常規(guī)的程序。如果你嘗試在JAVA APPLET內(nèi)使用該方法,你需要稍稍修改SecurityManager。但是,因為你不是經(jīng)常需要與它打交道,這里也就不再贅述了。
這里是本次內(nèi)容的列表:
1.訪問私有字段。
2.訪問私有方法。
訪問私有字段:
為了訪問私有字段,你需要調(diào)用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")。正是這個調(diào)用這個方法返回了私有字段。這個方法僅僅根據(jù)指定的類返回字段,不會返回父類申明的字段。
另外仔細觀察加粗的語句。通過調(diào)用 Field.setAccessible(true),你關(guān)掉了對于這個指定字段實例的訪問檢查,僅僅對反射有效?,F(xiàn)在你能訪問它了,不管它是私有的,保護的或是默認的(default),即時調(diào)用者并不在該范圍中。你仍然不能通過常規(guī)方法訪問該字段,因為編譯器不允許。
訪問私有方法
為了訪問一個私有方法,你需要調(diào)用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);
這個代碼例子會打印出文本"returnValue = The private Value",該值正好是私有方法的返回值。
注釋:只有在單獨的JAVA程序中運行該代碼才有效,就像你做一些單元測試或者常規(guī)的程序。如果你嘗試在JAVA APPLET內(nèi)使用該方法,你需要稍稍修改SecurityManager。但是,因為你不是經(jīng)常需要與它打交道,這里也就不再贅述了。
這里是本次內(nèi)容的列表:
1.訪問私有字段。
2.訪問私有方法。
訪問私有字段:
為了訪問私有字段,你需要調(diào)用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")。正是這個調(diào)用這個方法返回了私有字段。這個方法僅僅根據(jù)指定的類返回字段,不會返回父類申明的字段。
另外仔細觀察加粗的語句。通過調(diào)用 Field.setAccessible(true),你關(guān)掉了對于這個指定字段實例的訪問檢查,僅僅對反射有效?,F(xiàn)在你能訪問它了,不管它是私有的,保護的或是默認的(default),即時調(diào)用者并不在該范圍中。你仍然不能通過常規(guī)方法訪問該字段,因為編譯器不允許。
訪問私有方法
為了訪問一個私有方法,你需要調(diào)用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);
這個代碼例子會打印出文本"returnValue = The private Value",該值正好是私有方法的返回值。
相關(guān)文章
SpringBoot攔截器實現(xiàn)登錄攔截的方法示例
這篇文章主要介紹了SpringBoot攔截器實現(xiàn)登錄攔截的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09如何用JAVA判斷當前時間是否為節(jié)假日、周末、工作日及調(diào)休日(不報錯:IOException!)
最近公司有個業(yè)務需要判斷工作日,但是每年的節(jié)假日不一樣,下面這篇文章主要給大家介紹了關(guān)于如何用JAVA判斷當前時間是否為節(jié)假日、周末、工作日及調(diào)休日的相關(guān)資料,且不報錯:IOException!,需要的朋友可以參考下2023-12-12對Java字符串與整形、浮點類型之間的相互轉(zhuǎn)換方法總結(jié)
今天小編就為大家分享一篇對Java字符串與整形、浮點類型之間的相互轉(zhuǎn)換方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Struts2學習筆記(3)-DMI動態(tài)調(diào)用方式
本文主要介紹Struts2的DMI動態(tài)調(diào)用的兩種方式,簡單實用,希望能給大家做一個參考。2016-06-06