java學習Class動態加載

1、通過Class獲取類的成員屬性

public class MyMain { 
    public static void main(String[] args) throws ClassNotFoundException{
    //獲取整個類  
    Class c = Class.forName("java.lang.Integer");  
      //獲取所有的屬性?  
    Field[] fs = c.getDeclaredFields();  

    //定義可變長的字符串,用來存儲屬性  
    StringBuffer str = new StringBuffer();
    //最外邊的public定義
    str.append(Modifier.toString(c.getModifiers()) + " class "+ c.getSimpleName() +"{\n");  
    //裏邊的每一個屬性  
    for(Field field:fs){  
        str.append("\t");//空格  
        str.append(Modifier.toString(field.getModifiers())+" "); 
        str.append(field.getType().getSimpleName() + " ");
        str.append(field.getName()+";\n");
    }  

    str.append("}");  

    System.out.println(str); 
    }
}

執行結果如下:

public final class Integer{
    public static final int MIN_VALUE;
    public static final int MAX_VALUE;
    public static final Class TYPE;
    static final char[] digits;
    static final char[] DigitTens;
    static final char[] DigitOnes;
    static final int[] sizeTable;
    private final int value;
    public static final int SIZE;
    public static final int BYTES;
    private static final long serialVersionUID;
}

2、加載類
java中,自動定義加載類,需要繼承ClassLoader,然後重寫findClass方法;findclass找到目標class文件,然後交給loadClass,最後通過defineClass返回字節碼類

loadClass->findClass->defineClass
所以重寫findClass
findClass根據傳入的名字,打開,讀取二進制,然後通過defineClass返回結果
最終得到myClassLoader後,調用接口loadClass
Android爲我們從ClassLoader派生出了兩個類:DexClassLoader和PathClassLoader

3、動態加載

動態加載,從C++的角度理解看,獲取了目標模塊的類名稱,並且可以通過newInstance來創建新對象,可以直接執行;此對象可以是實現了某個接口類,那麼把得到的心對象轉換成接口類,可以直接調用

4、聲明接口類

接口類可以打包成一個jar文件,直接包含到另一個工程裏,可以直接添加接口名字
需要使用哪個接口,只需要把對應的jar包含進來,然後直接輸入接口名字即可
引入jar包,可以新建一個lib文件夾,然後把jar文件先導進來,這時還不能使用jar包裏的文件;然後右鍵->BuildPath,在lib中,選中要導入的jar文件,這時纔可以使用其中的接口或者類

5、獲取Class類型的3中方法

        String str1 = "abc";//字符串1  
        String str2 = "abcd";//字符串2  
        //三種方式獲取Class類型  
        Class cls1 = str1.getClass();  
        Class cls2 = str2.getClass();  
        Class cls3 = String.class;  
        Class cls4 = Class.forName("java.lang.String");  

獲得Class對象後,即可調用newInstance進行實例化對象,然後直接使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章