反射
反射,在運行時,動態分析或使用一個類進行工作。
類對象,是一個描述這個類資訊的對象,對虛擬機器載入類的時候,就會建立這個類的類對象並載入該對象。Class,是類對象的類型。只有對象才會被載入到虛擬機器中。一個類只會被載入一次。
獲得類對象的三種方式:(類對象不用new的方法得到的)
1)也可以用類名.Class,獲得這個類的類對象。
2)用一類的對象掉用a.getClass(),得到這個對象的類型的類對象。
3)也可以使用Class.forName(類名)(Class類中的靜態方法),也可以得到這個類的類對象,(注意,這裡寫的類名必須是全限定名(全名),是包名加類名,XXX.XXX.XXXX)。強制類載入,這種方法是經常使用的。
一個類的類對象是唯一的。
在使用Class.forName(類名)時,如果使用時寫的類名的類,還沒有被載入,則會載入這個類。
Class c,c.getSuperclass()這個方法是獲得這個類的父類的類對象。c.getInterfaces()會獲得這個類所實現的介面,這個方法返回是一個類對象的數組。
方法對象是類中的方法的資訊的描述。java.lang.reflect.Method,方法類的對象可以通過類對象的getMethods() 方法獲得,獲得的是一個方法對象的數組,獲得類中的定義的所有方法對象,除了構造方法。
構造方法對象,是用來描述構造方法的資訊。java.lang.reflect.Constructor構造方法類的對象可以通過類對象的getConstructors()方法獲得,獲得這個類的所有構造方法對象。
屬性對象,使用來描述屬性的資訊。java.lang.reflect.Field屬性類的對象對象可以通過類對象getFields() 這個方法是獲得所有屬性的屬性對象。
反射可以擷取這個類中定義的方法和屬性的資訊,單一資料型別在使用反射時要轉換成封裝類。
反射可以通過類對象操縱類,產生這個類的對象,調用方法等等。
使用反射構造一個類的對象的步驟
1,獲得類對象(類對象是對類的資訊的描述)
2,獲得構造方法對象(方法對象是類中的方法的資訊的描述)
3,獲得對象(用構造方法對象掉用構造方法,如果是使用無參構造方法,可以跳過第2部,直接使用類對象.newInstance() 方法來獲得這個類的對象)
4,獲得方法對象。
5,用方法對象調用方法(用這個類的對象作為第一參數)。
這裡在調用方法時,方法的參數表,是用用類對象數組表示參數類型的。
其他有關於反射的方法可以查閱API文檔。java.lang.Class,java.lang.reflce包
反射提供了最大的通用性,反射可以繞過編譯器,反射可以訪問對象的私人屬性和方法。
import java.lang.reflect.*;
public class TestReflect {
public static void main(String[] args) throws Exception {
// 1.get class Object
Class c = Class.forName("Student");
// 2.get Constructor object
Class[] cs = { String.class };
Constructor con = c.getConstructor(cs);// 按照參數表來調用制定構造方法。
// 3.create object
Object[] os = { "liucy" };
Object o = con.newInstance(os);
// 4.get method object
String methodName = "study";
Class[] pcs = { String.class };
Method m = c.getMethod(methodName, pcs);// 按照參數表來獲得制定的方法對象。
// 5.invoke the method
Object[] ocs = { "EJB" };
m.invoke(o, ocs);
}
}
class Student {
private String name;
public Student(String n) {
this.name = n;
}
public void study(String course) {
System.out.println(name + " studies " + course);
}
public void eat(String food) {
System.out.println(name + " eats " + food);
}
}
class Teacher {
String name;
public Teacher(String n) {
this.name = n;
}
public void teach(String course) {
System.out.println(name + " teaches " + course);
}
}