reflect

反射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中集合的泛型,是防止錯誤輸入的,只在編譯階段有效。

能夠經過反射來操做,繞過編譯。

相關文章
相關標籤/搜索