1. 程式人生 > >面試題9——反射的用途及實現

面試題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()

四、注意:

      由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立一個物件,那麼就不需要用反射。
另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。