1. 程式人生 > 實用技巧 >Java反射機制

Java反射機制

反射是一種機制,利用該機制可以在程式執行時得到類中的成員變數、成員方法、構造方法等。

當我們第一次使用一個類的時候,必須把這個類載入到方法區中才能使用。類載入器把類載入到方法區時,同時會給被載入的類建立一個Class型別的物件,這個Class型別的物件用來描述這個類,裡面儲存的是這個類的資訊。

Class型別的物件,用於描述被載入的類,裡面儲存所有的資訊。反射操作的就是這個物件。

獲取Class物件的三種方式:

1.通過物件.getClass()獲取

2.通過類名.class獲取

3.(常用)通過Class類的forName(String className)方法Class.forName()

獲取類的Class物件(全限定類名)

不管通過哪種方式獲取Class物件,獲取到的都是同一個Class物件。

Class物件的常用方法

String getName();  //獲取全限定類名

String getSimpleName();  //獲取簡單類名

T newInstance();  //使用空參構造建立該類的物件

Constructor<?>[] getConstructors();  //獲取類中全部的構造方法,只能獲取公共構造方法

Constructor<T> getConstructor(Class<?>... parameterTypes);  //獲取類中指定的構造方法,引數是構造方法的引數列表(的Class物件)

constructor類的構造方法

T newInstance(Object... initargs);  //引數是執行構造方法時實際傳遞的引數,返回值是建立的物件

注:以上方式(反射)只能獲取到公共構造方法,如果需要獲取其他修飾符修飾的構造方法需要使用暴力反射

暴力反射:

暴力反射可以獲取到類中所有許可權的成員並使用。

但並不推薦使用,因為會破壞封裝性。

 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);//獲取類中指定的構造方法
 Constructor<?>[] getDeclaredConstructors();//獲取類中全部的構造方法

獲取類中的成員方法並進行使用

在Class中有一些方法可以獲取成員方法

 Method getMethod(String name, Class<?>... parameterTypes);//獲取類中指定的成員方法,指定成員方  法的方法名和方法的引數型別
 Method[] getMethods();//獲取類中全部的成員方法

Method類的執行方法

 Object invoke(Object obj, Object... args) 
 //第一個引數傳物件,表示呼叫哪個物件的成員方法,如果呼叫靜態方法可以為null。
 //第二個可變引數傳實際傳遞的引數。

同構造方法,只能獲取到公共的成員方法。
跟直接new物件呼叫方法相比,反射的方法執行權在方法手中,由方法來執行呼叫過程。