Java 反射之私人欄位和方法詳細介紹

來源:互聯網
上載者:User

儘管我們通常認為通過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);

這個代碼例子會列印出文本"returnValue = The private Value",該值正好是私人方法的傳回值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.