《java之反射訪問私有域和私有方法》

2021-08-26 20:54:37 字數 1968 閱讀 3664

**如下:

public class privateobject   

}  **如下:

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 getprivatestring()  

}  **如下:

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差點**,私有的都能訪問了,還有什麼安全可言?

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

getdeclaredmethod()和getmethod()的區別

getdeclaredmethod*()獲取的是類自身宣告的所有方法,包含public、protected和private方法。

getmethod*()獲取的是類的所有共有方法,這就包括自身的所有public方法,和從基類繼承的、從介面實現的所有public方法。

c 反射訪問私有變數

反射是反射dll程式集中的資訊 用反射可以做幾件事,下面演示如何訪問private 比如這有乙個class library 叫ticketlibrary 裡面有乙個class叫ticketinfo ticketinfo.cs 裡面有乙個叫ticketlist的private static list ...

通過反射可以訪問私有變數 方法

今天學習rtti的時候,發現通過反射可以訪問私有方法 也可以改變私有變數的值,這樣來說的話private 是不是基本沒有意義了啊?public class user public string get 測試類如下 public class testmain 獲得所有屬性名字 field fields...

C 中訪問私有成員 反射

首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...