天天看點

java反射——設計架構的靈魂

目錄

​​一、什麼是反射(機制)​​

​​二、反射的好處​​

​​三、擷取Class類對象的方式​​

​​四、Class類的執行個體化對象具有的功能​​

​​反射的應用​​

​​1、寫一個"架構",不能改變該類的任何代碼的前提下,可以幫我們建立任意類的對象,并且執行其中任意方法​​

​​2、泛型擦除​​

一、什麼是反射(機制)

反射實際是一個 ”正“ 和 ”反“ 的操作,所謂的 ”正“ 操作就是用已知的一個類去得到一個對象,繼而使用這個對象的屬性和方法;而 ”反“ 操作是當我們java檔案編譯之後形成class檔案,每個class檔案都是Class類的一個對象,這個對象也可稱為檔案對象,通過這個檔案對象可以得到這個.java類。

二、反射的好處

可以在程式運作過程中,操作這些對象。如下,為什麼可以檢視到所有的方法清單,就是通過反射機制實作這個功能的,提前把str對象加載進記憶體,通過反射擷取所有的方法封裝成Method對象,然後将這些對象放到Method[]數組中展示出來

java反射——設計架構的靈魂

可以解耦,提高程式的可擴充性。

三、擷取Class類對象的方式

如何得到Class類的一個執行個體化對象?有以下三種方式

java反射——設計架構的靈魂

第一種:通過Class類内部提供的forName()方法直接根據類的完成路徑擷取執行個體化對象

說明:Class.forName("全類名(包含包名)"),因為他是一個字元串可以加載到配置檔案中,讀取檔案加載類。由于字元串支援拼接友善,是以這種方式使用較多!

第二種:通過類.class直接擷取Class執行個體化對象

說明:類名.class:已經将位元組碼對象加載進記憶體了,通過類名的屬性class擷取多用于參數的傳遞

第三種:使用Object類提供的 public final Class<?> getClass()方法擷取一個Class執行個體化對象

Object是所有類的父類,這樣所有類的執行個體化對象可以直接利用getClass()得到Class類執行個體化對象

比較三個Class對象,結果都是true

System.out.println(personClass==personClass1);

System.out.println(personClass1==personClass2);

結論:同一個位元組碼檔案(*.class)在一次程式運作過程中,隻會被加載一次,不論通過哪一種方式擷取的Class對象都是同一個。

四、Class類的執行個體化對象具有的功能

反射的應用

1、寫一個"架構",不能改變該類的任何代碼的前提下,可以幫我們建立任意類的對象,并且執行其中任意方法

步驟:

  • 将需要建立的對象的全類名和需要執行的方法定義在配置檔案中
  • 在程式中加載讀取配置檔案
  • 使用反射技術來加載類檔案進記憶體
  • 建立對象
  • 執行方法
java反射——設計架構的靈魂
java反射——設計架構的靈魂

2、泛型擦除

如何向泛型是String的集合中添加Integer類型的資料,

List<String> list = new ArrayList<>();
list.add("a");
list.add(1);      
List<String> list = new ArrayList<>();
 list.add("a");
 //通過反射擷取list的類的檔案對象
  Class clazz = list.getClass();
 //擷取list中的add方法
 Method method = clazz.getMethod("add",Object.class);
 //使用方法
  method.invoke(list,100);
  method.invoke(list,50);
   System.out.println(list);//[a, 100, 50]      

繼續閱讀