深入詳解Java反射機制與底層實現原理?

帶你聊技術發表於2023-01-04

深入詳解Java反射機制與底層實現原理?

Java面試的時候經常會被問到Java反射機制,尤其喜歡問:

  1. Java反射機制?

  2. 為什麼要用反射機制?

  3. Java反射機制的原理?

  4. Java反射機制用在什麼地方等等?


今天主要分享以上內容,詳解Java反射機制的底層實現

Java反射機制是什麼?


Java反射機制是指在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法。


任意一個物件,都能夠呼叫它的任意一個方法和屬性,這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。


用一句話總結就是反射可以實現在執行時可以知道任意一個類的屬性和方法。


為什麼要用反射?


Java Reflection功能非常強大,並且非常有用,比如:

深入詳解Java反射機制與底層實現原理?

  • 獲取任意類的名稱、package資訊、所有屬性、方法、註解、型別、類載入器等;

  • 獲取任意物件的屬性,並且能改變物件的屬性;

  • 呼叫任意物件的方法;

  • 判斷任意一個物件所屬的類;

  • 例項化任意一個類的物件;

  • 透過反射我們可以實現動態裝配,降低程式碼的耦合度,動態代理等。


Java反射機制原理


Java反射操作的是java.lang.Class物件,所以要理解Java反射機制,就需要搞懂Class物件。


如舉一個簡單的例子,建立一個物件:


MikeChen mikechen= new MikeChen();

在執行上面語句的時候,首先 JVM 啟動,程式碼會編譯成一個 .class 檔案,然後被類載入器ClassLoader載入進 JVM 的記憶體中,併為之建立一個 java.lang.Class 物件。

我們的 MikeChen類會載入到方法區中,建立了的 MikeChen類的 Class 物件會到堆中。

理解 Java 的反射機制就是要理解 Class 類資訊。

每個類的執行時的型別資訊,用 Class 物件表示,又或者稱之為位元組碼物件。

Class 檔案的整體結構如下圖所示:

深入詳解Java反射機制與底層實現原理?

它包含了與類相關的資訊,而例項物件就是透過 Class 物件來建立的。

獲取 Class 物件的方式:

  1. 例項物件呼叫 Object 類的getClass()方法;

  2. 透過屬性類名.class直接獲取;

  3. 呼叫 Class 類的forName()方法;

  4. 使用類載入器 ClassLoader 的getSystemClassLoader().loadClass()方法。




















package com.mikechen.reflection; import com.mikechen.model.Person; public class ReflectionTest {    public static void main(String[] args) throws Exception {        //1. 例項物件.getClass()        Person person = new Person();        Class clz1 = person.getClass();        System.out.println(clz1);         //2,類名.class屬性        System.out.println(Person.class);         //3. Class.forName()        Class clz2 = Class.forName("com.mikechen.reflection.Person");        System.out.println(clz2);    }}

以上三種方式都能獲取 Person 類的位元組碼物件,但同時也存在區別:

  • 方法1:需要建立一個例項物件才能獲取類的資訊;

  • 方法2:則需要匯入包否則無法透過編譯;

  • 方法3:只需傳入類名的字串,這個類名是類完整路徑;


我們一般平時是透過new的形式建立物件實際上就是透過這些Class來建立的,只不過這個class檔案是編譯的時候就生成的,程式相當於寫死了給jvm去跑。

深入詳解Java反射機制與底層實現原理?

反射是什麼呢?

當我們的程式在執行時,需要動態的載入一些類這些類可能之前用不到,所以不用載入到jvm,而是在執行時根據需要才載入。


Java反射的應用場景

面向開發,反射應用最廣泛的是中介軟體和框架,比如:

深入詳解Java反射機制與底層實現原理?

  • JDBC的Class.forName(driverClass)載入驅動;

  • Spring MVC 透過反射呼叫 controller 的方法,動態代理處理請求;

  • Spring IOC 容器,在建立 Bean 例項時和依賴注入時的反射。

  • RMI 反序列化,反射呼叫遠端方法;

  • RPC Dubbo動態代理利用;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2930747/,如需轉載,請註明出處,否則將追究法律責任。

相關文章