Class類--java類的抽象,是一個特殊的類.
當初理解為每個用class定義的java類,不管是系統定義還是自訂的類,都是Class的執行個體;現在自我糾正,Class類的執行個體是各個類在記憶體中的位元組碼,張老師講每個類的位元組碼是不同的,所以每個類的位元組碼在記憶體裡儲存的內容也是不同的,這些不同的記憶體空間對應的對象就是Class類的執行個體(有點像是指向java類的位元組碼的指標啊).
得到Class對象
三種方法得到Class對象:
1。直接指定位元組碼對象 Class cls = x.class;
2。通過類的對象調用getClass()方法獲得
3. 通過Class.forname(String str)方法指定
Constructor類是對java類的構造方法的抽象,通過反射構造類的執行個體,
Constructor constr = new String().getClass().getConstructor(x.class...); //x.class是對應構造方法的參數所屬的Class對象,可變參數
String str = constr.newInstance(x...); //x是構造方法的參數,不是Class對象,但必須是x.class的一個執行個體對象,可變參數
用new String().getClass().newInstance()調用無參數的構造方法
Field是對java類的的成員變數的抽象,每個Field對象都是類的屬性.
String heima = new String("heima");
Field field = heima.getClass().getField(x);//x是屬性名稱,類型為String
field.get(heima);//heima是所要獲得值的屬性的所屬對象
//field和指向類變數的指標很相似
對私人變數的擷取,getField()只能擷取可見的變數,對於私人變數則不能擷取
Field field = new Object().getClass().getDeclaredField(x);//x是屬性名稱,類型為String;獲得指定的類的已聲明屬性
只是擷取field對象還不能取出對應的屬性的值
field.setAccessible(true);//設定為可訪問,則field所對應的屬性不再受private限制(很拽的方法)
field.get(obj);
Method是java類的方法的抽象,每個Method對象都是類的一個方法
Method method = new String().getClass().getMethod(String strName,x.class...);//擷取類的指定的方法,getMethod()的參數strName是方法名,String類型,x.class是方法的參數類型,是Class對象,可變參數
method.invoke(obj,x);//調用方法,obj是調用方法的對象,若為靜態方法,可為null;x是x.class的執行個體對象,即方法的參數
和變數一樣,當要調用類的私人方法時,採用同樣的方式也可
自訂一個類TestPoint
public class TestPoint {
public String name;
public TestPoint(String name) {
super();
this.name = name;
}
private void toString()
{
System.out.println(name);
}
}
通過反射調用toString()方法
TestPoint tp = new TestPoint("這是私人方法調用");
Method tpMethod = tp.getClass().getDeclaredMethod("toString");//因為是無參數的方法,只有一個方法名的參數
tpMethod.setAccessible(true);
tpMethod.invoke(tp);//這裡也只有一個參數
反射的基礎就是Class類,只有先獲得了Class對象才可以進行反射的相關操作.