Java反射機制
阿新 • • 發佈:2020-07-23
反射是一種機制,利用該機制可以在程式執行時得到類中的成員變數、成員方法、構造方法等。
當我們第一次使用一個類的時候,必須把這個類載入到方法區中才能使用。類載入器把類載入到方法區時,同時會給被載入的類建立一個Class型別的物件,這個Class型別的物件用來描述這個類,裡面儲存的是這個類的資訊。
Class型別的物件,用於描述被載入的類,裡面儲存所有的資訊。反射操作的就是這個物件。
獲取Class物件的三種方式:
1.通過物件.getClass()獲取
2.通過類名.class獲取
3.(常用)通過Class類的forName(String className)方法Class.forName()
不管通過哪種方式獲取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物件呼叫方法相比,反射的方法執行權在方法手中,由方法來執行呼叫過程。