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

2021-09-27 01:50:18 字數 3345 閱讀 9386

反射:

reflection

反編譯:通過對類檔案的操作,實現原始碼的復現。

反射:在執行狀態中,對於任意乙個類,都能夠知道這個類的所有屬性和方法(看不到原始碼)。

動態獲取。

主要可以獲得 所有的 屬性(公有,私有,受保護,預設)

方法(公有,私有,受保護,預設)

還能對屬性進行賦值,對方法進行賦值

優點:針對大型軟體,如果進行公升級和改造,可以通過反射機制動態呼叫方法,來更改原來方法的不足,提高軟體的靈活性。

反射的使用:
一:object -> getclass();返回此object的執行時的類

二:任何資料型別(基本資料型別)都有乙個靜態的class屬性。

object.class;

class.forname("");返回與給定字串名稱或介面相關聯的類的物件

獲得構造方法並賦值

/**

* 反射 呼叫構造方法:

* getconstructors() 返回乙個陣列包含 constructor物體反射所有的 類物件表示的類的公共呼叫構造方法。(只返回public修飾的構造方法)

* getdeclaredconstructors() 反射所有構造方法

* */

public

class

reflectionmain1

system.out.

println

("輸出所有呼叫構造方法");

constructor[

] con = a.

getdeclaredconstructors()

;for

(constructor c:con)

system.out.

println()

;//getdeclaredconstructor();括號裡面寫的是想要賦值的構造方法的引數型別

constructor co = a.

getdeclaredconstructor

(string.

class);

system.out.

println

(co)

;//private型別是不可訪問的,所以要用setaccessible為true去暴力訪問

//暴力訪問private型別

co.setaccessible

(true);

//進行賦值

object obj=co.

newinstance

("zyl");

system.out.

println

(obj);}

catch

(instantiationexception e)

catch

(illegalacces***ception e)

catch

(invocationtargetexception e)

catch

(classnotfoundexception e)

}}

獲得物件並賦值

/**

* 反射 呼叫物件:

* getfields() 返回public修飾的物件

* getdeclaredfields 返回所有物件

*/public

class

reflectionmain2

field[

] f1=a.

getdeclaredfields()

;for

(field f2:f1)

field name =

null

;try

catch

(nosuchfieldexception

| nosuchmethodexception | instantiationexception | illegalacces***ception | invocationtargetexception e)

}}

獲得方法並賦值

/**

* 反射獲得方法並呼叫

* getmethods() 返回所有public修飾的方法

* getdeclaredmethods() 返回所有方法

*/public

class

reflectionmain3

method show =

null

;try

catch

(nosuchmethodexception e)

catch

(illegalacces***ception e)

catch

(instantiationexception e)

catch

(invocationtargetexception e)

}}

student類

package demo14;

public

class

student

private

student

(string borth)

public

student

(string name, string borth,

char ***)

student

(string name,

int age,

char ***)

student()

public

void

show

(string name)

@override

public string tostring()

';}public string getname()

public

char

get***()

public

void

set***

(char ***)

public string getborth()

public

void

setborth

(string borth)

public

void

setname

(string name)

public

intgetage()

public

void

setage

(int age)

}

反射獲取構造方法並使用

student類 package com.reflect 02 public class student private student string name student string name,intage public student string name,int age,string ...

通過反射遍歷Model物件獲得屬性與賦值。

今天開發中遇到乙個問題,乙個model有80多個屬性 字段 現需要給這些屬性賦值。如果使用判斷取一一匹配的話,估計需要幾百行 那麼有沒有很好的辦法能夠自動匹配屬性並賦值呢?答案肯定是有的 反射遍歷屬性。我這裡建了乙個控制太應用程式進行測試,並建了乙個student的model類,並給了3個字段。st...

物件導向 反射方法

首先看乙個例子 在物件導向中一般情況下怎麼去調屬性 class student def init self,name,age self.name name self.age age defrun self print class teacher student pass stu1 student z...