反射:
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...