Java-反射

 Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲Java語言的反射機制。
 java

一、關於Class

    一、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);  
}

三、利用newInstance建立對象:調用的類必須有無參的構造器

/** 
 * 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
相關文章
相關標籤/搜索