Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲Java語言的反射機制。
java
一、Class是一個類,一個描述類的類(也就是描述類自己),封裝了描述方法的Method,描述字段的Filed,描述構造器的Constructor等屬性
二、對象照鏡子後(反射)能夠獲得的信息:某個類的數據成員名、方法和構造器、某個類到底實現了哪些接口。
三、對於每一個類而言,JRE 都爲其保留一個不變的 Class 類型的對象。
一個 Class 對象包含了特定某個類的有關信息。
四、Class 對象只能由系統創建對象
五、一個類在 JVM 中只會有一個Class實例測試
/** * 反射機制獲取類有三種方法 */ @Test public void testGetClass() throws ClassNotFoundException { Class clazz = null; //1 直接經過類名.Class的方式獲得 clazz = Person.class; System.out.println("經過類名: " + clazz); //2 經過對象的getClass()方法獲取,這個使用的少(通常是傳的是Object,不知道是什麼類型的時候才用) Object obj = new Person(); clazz = obj.getClass(); System.out.println("經過getClass(): " + clazz); //3 經過全類名獲取,用的比較多,但可能拋出ClassNotFoundException異常 clazz = Class.forName("com.java.reflection.Person"); System.out.println("經過全類名獲取: " + clazz); }
/** * Class類的newInstance()方法,建立類的一個對象。 */ @Test public void testNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class clazz = Class.forName("com.java.reflection.Person"); //使用Class類的newInstance()方法建立類的一個對象 //實際調用的類的那個 無參數的構造器(這就是爲何寫的類的時候,要寫一個無參數的構造器,就是給反射用的) //通常的,一個類若聲明瞭帶參數的構造器,也要聲明一個無參數的構造器 Object obj = clazz.newInstance(); System.out.println(obj); }
/** * ClassLoader類裝載器 */ @Test public void testClassLoader1() throws ClassNotFoundException, IOException { //一、獲取一個系統的類加載器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系統的類加載器-->" + classLoader); //二、獲取系統類加載器的父類加載器(擴展類加載器(extensions classLoader)) classLoader = classLoader.getParent(); System.out.println("擴展類加載器-->" + classLoader); //三、獲取擴展類加載器的父類加載器 //輸出爲Null,沒法被Java程序直接引用 classLoader = classLoader.getParent(); System.out.println("啓動類加載器-->" + classLoader); // //四、測試當前類由哪一個類加載器進行加載 ,結果就是系統的類加載器 classLoader = Class.forName("com.java.reflection.Person").getClassLoader(); System.out.println("當前類由哪一個類加載器進行加載-->"+classLoader); //五、測試JDK提供的Object類由哪一個類加載器負責加載的 classLoader = Class.forName("java.lang.Object").getClassLoader(); System.out.println("JDK提供的Object類由哪一個類加載器加載-->" + classLoader); }
系統的類加載器-->sun.misc.Launcher$AppClassLoader@43be2d65 擴展類加載器-->sun.misc.Launcher$ExtClassLoader@7a9664a1 啓動類加載器-->null 當前類由哪一個類加載器進行加載-->sun.misc.Launcher$AppClassLoader@43be2d65 JDK提供的Object類由哪一個類加載器加載-->null |