反射是在只知道類的名字和路徑的情況下,通過反射獲取類中的屬性,構造器,方法,並創建該類的對象,使用其中的方法。
反射可以分爲 步:創建字符串(內容爲類的路徑)———- String s=”com.reflection.Test”
使用Class.forName得到該類的類——— Class c =Class.forName(s);
然後同過Class.get來取得屬性,構造器,方法的數組——– Filed / Constructor /Method [] f =c.getFiled(); / c.getConstructor(); / c.getMethod();
通過數組來調用屬性,構造器,方法————-
其中屬性爲:f[X].set();
構造器:f[X].newInstance();
方法爲:f[x].invoke();
String s ="reflection.Test";
Class c =Class.forName(s);
Method m[]=c.getDeclaredMethods();
Constructor [] cons =c.getDeclaredConstructors();
Filed [] fil =c.getDeclaredFields();
for(Constructor con:cons){
System.out.println(con);
}
for(Method ma:m){
System.out.println(ma);
}
for(Filed fi:fil){
System.out.println(fi);
}
Test te =(Test) cons [0].newInstance(); //構造對象時需要強轉
m[4].invoke(te,20); //調用第五個方法,對象爲te,參數爲20
fil[0].set(te,"lllll"); //給第一個屬性賦值
}
結果輸出爲:
屬性列表
private java.lang.String 反射.Test.name
private int 反射.Test.age
構造器列表
public 反射.Test()
方法列表
public void 反射.Test.add(int)
public java.lang.String 反射.Test.getName()
public void 反射.Test.setName(java.lang.String)
public void 反射.Test.setAge(int)
public int 反射.Test.getAge()
特別要注意,靜態的方法和屬性可以直接調用,當沒有參數列表或對象時用null表示。