首頁>技術>

JAVA 反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為 java 語言的反射機制。而我們使用反射的目的也正是為了動態的獲取類或者物件的資訊。在編寫框架底層程式碼時離不開反射,在一些日常開發業務中有時候也會用到反射,比如前一段時間我需要給我的物件接收一些值,對方傳的json不固定,就可以透過反射來進行賦值,同時面試反射這一塊的知識也是必不可少的。

獲取 Class 物件的四種方式

如果我們使用反射來動態獲取到類或物件的這些屬性或方法資訊,我們需要依靠 Class 物件。Class 類物件將一個類的方法、變數等資訊告訴執行的程式。Java 提供了四種方式獲取 Class 物件:

1.知道具體類的情況下:

Class alunbarClass = TargetObject.class;

如果是不知道具體類的,基本都是透過遍歷包下面的類來獲取 Class 物件,透過此方式獲取Class物件不會進行初始化。

2.透過 Class.forName()傳入類的路徑獲取:

Class chengxuyuande365 = Class.forName("cn.chengxuyuande365.TargetObject");

Class.forName(className)方法,內部實際呼叫的是一個native方法 forName0(className, true,ClassLoader.getClassLoader(caller), caller);

第2個boolean引數表示類是否需要初始化,Class.forName(className)預設是需要初始化。

一旦初始化,就會觸發目標物件的 static塊程式碼執行,static引數也會被再次初始化。

3.透過物件例項instance.getClass():

Chengxuyuande365 c = new Chengxuyuande365();Class chengxuyuande365 = c.getClass();

4.透過類載入器xxxClassLoader.loadClass()傳入類路徑獲取:

class clazz = ClassLoader.LoadClass("cn.chengxuyuande365.TargetObject");

透過類載入器獲取Class物件不會進行初始化,意味著不進行包括初始化等一些列步驟,靜態塊和靜態物件不會得到執行。

四種方式中,透過類路徑來獲得Class物件的兩種方式都不會進行初始化。

程式碼例項

1.建立使用反射操作的類(包括私有屬性,公共方法,私有方法) TargetObject:

舉例(反射是框架設計的靈魂。):

我們在使用 JDBC 連線資料庫時使用 Class.forName()透過反射載入資料庫的驅動程式;Spring 框架的 IOC(動態載入管理 Bean)建立物件以及 AOP(動態代理)功能都和反射有聯絡;動態配置例項的屬性;......都看到這了,關注來一個吧,年入百萬不是夢!

3
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Vue3.0來龍去脈更新曆程