反射的個人理解

2021-09-30 16:30:07 字數 1401 閱讀 3825

一般格式:

class c = class.forname("要反射的類的全名稱");

object obj = c.newinstance();

或者class c = class.forname("要反射的類的全名稱");

constructor cons = c.getconstrustor(?);

object obj = cons.newinstance();

第一種格式:快速呼叫預設的無參構造引數,然後獲取乙個類的例項。優點是快速得到物件,但是需要有乙個可用的無參構造方法。而且擴充套件性一般

第二種格式:就是一般的格式啦最普遍的。。想呼叫那個構造方法就呼叫那個。

另外還有獲得方法的getmethod(?),獲得屬性的getfield(?)

而將getconstructor(),getmethod(),getfield()後加乙個s,如getconstructors(),getmethods(),getfields()這就返回的是所有的公有的構造方法,方法,屬性,記住是公有。而如果想要取得本類所有的構造方法,方法,屬性,那就應該呼叫這三個getdeclaredconstructors(),getdeclaredmethods(),getdeclaredfields(),就是在中間加入declared

為了增加擴充套件性,我們使用這三個類constructor、method、field。

就如第二種格式中的newinstance()就是使用的constructor類的方法.

method類中有執行方法的invoke方法,獲得方法名的getname(),獲得修飾符的getmodifiers(),注意這個方法返回的是int型的數字,需要我們使用modifier類的tostring(int)方法取得正確的修飾符,返回返回型別的getreturntype(),返回形參的... 

field類的get() /set()  

記住這個類accessibleobject,這個類是construstor,method,field的父類,有乙個可以取消訪問檢查,也就是可以讓反射的類呼叫那些不可以呼叫的屬性或方法的方法,如private的屬性或方法

public void setaccessible(boolean flag)
最後,使用反射一般是用在工廠模式中的,即介面+properties檔案,通過配置檔案操縱類

我們將類的全稱作為值存在properties檔案中,通過properties類的getproperties(key)得到類全稱,然後放到class.forname()方法中,然後就可以通過上面的兩種格式獲得這個類的物件了,而每次我們可以通過改變配置檔案修改要執行的類

那介面又是來幹什麼的呢?

我們通過介面與多型可以約束類的操作,如果你要想反射就要實現我的這個介面以及中的方法。

另外,現在更先進的技術是通過注釋來操縱類

反射的理解

反射 1 類的物件 依據我們定義的類 new 出來的物件,也成為例項物件 2 類物件 是類載入的產物,包括 包名,類名,屬性,方法,構造方法 獲取類物件 方式 通過反射的技術獲取類物件 會導致類先進行類載入 通過 類的物件 獲取 類物件 student s new student class c s...

反射的理解

class類物件的三種例項化模式 通過物件的確取得了物件的 這就是 反 的本質 在反射的世界裡它再看重的不再是乙個物件,而是物件身後的組成 類 構造 成員.取得class類物件的好處 可以直接通過反射例項化物件 newinstance public static void main string a...

反射的簡單理解

載入類 3個方式 person有2個屬性,name和age,最後會給出person類的資訊 class clazz1 class.forname person class clazz2 person.class person p new person class clazz3 p.getclass ...