1. 程式人生 > 實用技巧 >java.lang.IllegalArgumentException: ServletContext must not be null

java.lang.IllegalArgumentException: ServletContext must not be null

Java的反射機制

一、什麼是反射

反射是Java的特徵之一,是一種間接操作目標物件的機制,核心是JVM在執行的時候才動態載入類,並且對於任意一個類,都能夠知道這個類的所有屬性和方法,呼叫方法/訪問屬性,不需要提前在編譯期知道執行的物件是誰,他允許執行中的Java程式獲取類的資訊,並且可以操作類或物件內部屬性。程式中物件的型別一般都是在編譯期就確定下來的,而當我們的程式在執行時,可能需要動態的載入一些類,這些類因為之前用不到,所以沒有載入到jvm,這時,使用Java反射機制可以在執行期動態的建立物件並呼叫其屬性,它是在執行時根據需要才載入。

在我們日常的程式設計中不知不覺已經習慣“使用”反射機制——在使用IDEA進行開發的時候,在物件名後加一個“.”就能夠自動的獲得該物件的所有屬性和方法,這種功能可以說大大的遍歷我們的開發過程。這種功能的實現依靠的就是反射機制。

二、反射機制的作用

  1. 通過反射機制可以在執行時獲取類的各種屬性和方法,進行反編譯
  2. 反射最重要的用途就是開發各種通用框架。比如很多框架(Spring)都是配置化的(比如通過XML檔案配置Bean),為了保證框架的通用性,他們可能需要根據配置檔案載入不同的類或者物件,呼叫不同的方法,這個時候就必須使用到反射了,執行時動態載入需要的載入的物件
  3. 獲取一個類的訪問修飾符、成員和方法、構造方法和超類資訊
  4. 獲取並設定物件的一個成員,這個成員可以在執行期間才知道

利用java的反射機制可以很靈活的對載入到Java虛擬機器中的類資訊進行檢測

三、反射機制的基本原理

四、使用反射機制

首先介紹和反射相關的類:

  1. Java.lang.Class:java反射機制的起源,當一個類被載入之後,java虛擬機器就會自動生成一個Class物件,通過這個Class物件,我們就能夠獲得載入到java虛擬機器中的這個Class物件的所屬方法、成員和構造方法等資訊。
  2. Java.lang.reflect:reflect包下的 Constructor、 Field 、 Method、 Modifier,通過反射方式獲取
獲得Class

(1)Object-->getClass

(2)任何資料型別(包括基本的資料型別)都有一個“靜態”的class屬性

(3)通過class類的靜態方法:forName(String className),應用範圍較廣

判斷某個物件是否為某個類的例項
public native boolean isInstance(Object obj);
通過反射創造例項
  1. Class物件的newInstance()方法——動態代理中實現動態生成代理類的關鍵

    String.class.newInstance()
    
  2. 通過getConstructor()或getDeclareConstructor()方法獲得構造器(Constructor)物件並呼叫其的newInstance()方法

String.class.getConstructor(String.class).newInstance("Test");

參考博文:
https://blog.csdn.net/haluoluo211/article/details/49516689
https://blog.csdn.net/a745233700/article/details/82893076