反射java
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。spa
Class Foo{}orm Foo foo1 = new Foo(); Class c1 = Foo.class;get Class c2 = foo1.getClass();it //c1和c2都表示了foo類的實例對象,一個類只多是一個Class類的實例對象編譯 //類也是對象,是class類的實例對象,這個對象咱們稱爲此類的類型table //第三種表達方式class Class c3= Class.forName("com.imooc.reflect.Foo");泛型 //結果是c3==c2;c2==c1; //咱們徹底可又經過類的類類型建立此類的對象實例。 Foo foo = (Foo)c1.newInstance(); |
//new 建立對象,是靜態加載類,在編譯時刻就須要加載全部的可能使用到的類
//經過動態加載類,可解決這個問題。
Object obj = new Object();
Class c1 = obj.class;
Method[] ms = c.getMethods();
for(int i=0;i<ms.length;i++){
ms[i].getName();
}
getDeclaredMethods()獲取的是全部該類本身聲明的方法。
反射獲取成員變量的信息
成員變量也是對象,java.lang.reflect.Field封裝了關於成員變量 的操做
1.獲取構造han數的信息
c.getDeclaredConstructor();
關於 方法的反射
2.如何獲取某個方法
方法的名稱和方法的參數列表才能惟決定某個方法
3.方法反射的操做
method.invoke(對象,參數列表)
要獲取一個方法就是要獲取類的信息,獲取類的信息首先就要獲取類的類型。
Class A{
public void print(int a,int b){
}
}
方法的反射操做是用m對象來進行方法調用。
class A {
public void print(int a,int b){
System.out.println(a+b);
}
}
A a1 = new A();
Class c = a1.class;
Method m = c.getMethod("print",int.class,int.class);
Object o = m.invoke(a1,new Object[]{10,20}); 或者 Object o = m.invoke(a1,10,20);
反射的操做都是編譯以後的操做
編譯以後的泛型是去泛型化的,java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效。
能夠經過反射來操做,繞過編譯。