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進行實例化對象,然後直接使用