反射介紹
反射是什麼:
- java反射機制是在*運作狀态中*,對于任意一個實體類,都能夠知道這個類的所有屬性和方法,對于任意一個對象,都能夠調用它的任意方法和屬性(意思是我們可以知道運作狀态中的任意實體類的屬性和方法,并進行對象屬性和方法的調用)。
- 這種動态的擷取資訊以及動态調用對象屬性和方法的功能稱為java的反射機制。
- 反射:反射是架構的靈魂,将類的各個組成部分封裝為其他對象。
- 反射的好處:可以在程式的運作過程中去操作對象(例如泛型動态插入),位元組碼檔案,不需要重新編譯。
- 提高了程式的擴充性,複用性,解耦(降低耦合性);
java代碼在計算機中經曆的三個階段:
擷取類相關資訊的方法:
<U> Class<? extends U> asSubclass(Class<u> clazz);//把傳遞的類的對象轉換成代表其子類的對象
ClassLoader getClassLoader();//獲得類的加載器
Class<?>[] getClasses();//傳回一個數組,數組中包含該類中所有公共類和接口類的對象
Class<?>[] getDeclaredClasses();//傳回一個數組,數組中包含該類中所有類和接口類的對象
static Class<?> forName(String className);//根據類名傳回類的對象
String getName();//獲得類的完整路徑名字
T newInstance();//建立類的執行個體
getPackage();//獲得類的包
String getSimpleName();//獲得類的名字
String getSuperclass();//獲得目前類繼承的父類的名字
getInterfaces();//擷取目前類實作的類或是接口
.class();//擷取目前對象的類
擷取類的三種方式:
三種傳回類型是Class
(1)Object–>getClass//object子類都可以調用getClass方法
(2)任何資料類型(包括基本的資料類型)都有一個“靜态”的class屬性
(3)通過class類的靜态方法:forName(String className)(最常用)
public class Fanshe {
public static void main(String[] args) {
//第一種方式擷取Class對象
Student stu1 = new Student();//這一new 産生一個Student對象,一個Class對象。
Class stuClass = stu1.getClass();//擷取Class對象
System.out.println(stuClass.getName());
//第二種方式擷取Class對象
Class stuClass2 = Student.class;
System.out.println(stuClass == stuClass2);//判斷第一種方式擷取的Class對象和第二種方式擷取的是否是同一個
//第三種方式擷取Class對象
try {
Class stuClass3 = Class.forName("fanshe.Student");//注意此字元串必須是真實路徑,就是帶包名的類路徑,包名.類名
System.out.println(stuClass3 == stuClass2);//判斷三種方式是否擷取的是同一個Class對象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
注意,在運作期間,一個類,隻有一個Class對象産生,是以列印結果都是true;
三種方式中,常用第三種,第一種對象都有了還要反射幹什麼,第二種需要導入類包,依賴太強,不導包就抛編譯錯誤。一般都使用第三種,一個字元串可以傳入也可以寫在配置檔案中等多種方法。
剩餘一部分餘内容轉載(我個人覺得寫得很好):
https://blog.csdn.net/a745233700/article/details/82893076?spm=1001.2014.3001.5506
還有詳解未更新完…