反射獲取構造方法並使用

2022-09-08 00:18:30 字數 2764 閱讀 1608

student類:

package

com.reflect_02;

public

class

student

private

student(string name)

student(string name,

intage)

public student(string name, int

age, string address)

//成員方法:乙個私有,四個公共

private

void

function()

public

void

method1()

public

void

method2(string s)

public string method3(string s, int

i) @override

public

string tostring() ';}}

view code

constructor> getconstructors() 返回包含乙個陣列constructor物件反射由此表示的類的所有公共構造類物件。
public

class

reflectdemo01 }}

此方法的執行結果:返回的構造方法 都是public的

constructor> getdeclaredconstructors() 返回乙個反映 constructor物件表示的類宣告的所有constructor物件陣列類 。

public

class

reflectdemo01 }}

該方法的執行結果:所有的構造方法都被返回

constructorgetconstructor(class >... parametertypes)  返回乙個constructor物件,該物件反映 constructor物件表示的類的指定的公共類函式

引數:你要獲取的構造方法的引數的個數和資料型別對應的位元組碼檔案物件

constructor提供了乙個類的單個建構函式的資訊和訪問。

t newinstance(object... initargs)使用此 constructor物件表示的建構函式,使用指定的初始化引數來建立和初始化建構函式的宣告類的新例項

public

class

reflectdemo01

}

使用getconstructor()方法來返回乙個constructor物件,通過constructor物件呼叫newinstance(object... initargs)方法來獲取乙個構造方法,結果如下:(為傳遞引數,使用了constructor物件表示的無參構造方法,創造了乙個student例項)

c

同樣,getconstructor()方法只能獲取公共的構造方法,所以需要使用

constructorgetdeclaredconstructor(class >... parametertypes) 返回乙個 constructor物件,該物件反映 constructor物件表示的類或介面的指定類函式

public

class

reflectdemo01

}

執行上面的**:出現異常

出現異常的原因在於,呼叫的構造方法是private或缺省的修飾符修飾的,而私有或缺省的訪問許可權是不能被直接拿來操作的。

但是,在反射中可以使用乙個方法來進行暴力反射,從而對被私有許可權的構造方法進行操作

public void setaccessible(boolean flag):將此物件的 accessible 標誌設定為指示的布林值。值為 true 則指示反射的物件在使用時應該取消 j**a 語言訪問檢查。

修改**:

public

class

reflectdemo01

}

修改**後的執行結果:

反射獲得物件,方法,構造方法,並賦值

反射 reflection 反編譯 通過對類檔案的操作,實現原始碼的復現。反射 在執行狀態中,對於任意乙個類,都能夠知道這個類的所有屬性和方法 看不到原始碼 動態獲取。主要可以獲得 所有的 屬性 公有,私有,受保護,預設 方法 公有,私有,受保護,預設 還能對屬性進行賦值,對方法進行賦值 優點 針對...

反射 根據Class型別獲取它的構造方法

constructor類是構造方法的物件的表示 對應的方法 一 獲取此類中定義的所有公共的構造方法 constructor getconstructor class parametertypes 返回乙個 constructor 物件,它反映此 class 物件所表示的類的指定公共構造方法。cons...

使用反射獲取Android中隱藏的方法

public void insert method m c.getmethod copymessagetoicc new class object s m.invoke smsmanager.getdefault null,pdu,1 catch exception e smsmanager.cop...