面試題9——反射的用途及實現
反射的核心是JVM在執行時才動態載入類或呼叫方法/訪問屬性,它不需要事先(寫程式碼的時候或編譯期)知道執行物件是誰。
一、Java反射框架主要提供以下功能:
- 1.在執行時判斷任意一個物件所屬的類;
- 2.在執行時構造任意一個類的物件;
- 3.在執行時判斷任意一個類所具有的成員變數和方法(通過反射甚至可以呼叫private方法);
- 4.在執行時呼叫任意一個物件的方法
二、主要用途 :
1、反射最重要的用途就是開發各種通用框架。
三、基本反射功能的實現(反射相關的類一般都在java.lang.relfect包裡):
1、獲得Class物件
使用Class類的forName靜態方法
直接獲取某一個物件的class
呼叫某個物件的getClass()方法
2、判斷是否為某個類的例項
用instanceof關鍵字來判斷是否為某個類的例項
3、建立例項
使用Class物件的newInstance()方法來建立Class物件對應類的例項。
先通過Class物件獲取指定的Constructor物件,再呼叫Constructor物件的newInstance()方法來建立例項。
4、獲取方法
getDeclaredMethods()
5、獲取構造器資訊
getDeclaredMethods()
getMethods()
getMethod()
6、獲取類的成員變數(欄位)資訊
getFiled: 訪問公有的成員變數
getDeclaredField:所有已宣告的成員變數。但不能得到其父類的成員變數
getFileds和getDeclaredFields用法
7、呼叫方法
invoke()
8、利用反射建立陣列
Array.newInstance()
四、注意:
由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立一個物件,那麼就不需要用反射。
另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。