深入詳解Java反射機制與底層實現原理?
Java面試的時候經常會被問到Java反射機制,尤其喜歡問:
Java反射機制?
為什麼要用反射機制?
Java反射機制的原理?
Java反射機制用在什麼地方等等?
今天主要分享以上內容,詳解Java反射機制的底層實現
Java反射機制是什麼?
Java反射機制是指在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法。
對於任意一個物件,都能夠呼叫它的任意一個方法和屬性,這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。
用一句話總結就是反射可以實現在執行時可以知道任意一個類的屬性和方法。
為什麼要用反射?
Java Reflection功能非常強大,並且非常有用,比如:
獲取任意類的名稱、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 檔案的整體結構如下圖所示:
它包含了與類相關的資訊,而例項物件就是透過 Class 物件來建立的。
獲取 Class 物件的方式:
例項物件呼叫 Object 類的getClass()方法;
透過屬性類名.class直接獲取;
呼叫 Class 類的forName()方法;
使用類載入器 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去跑。
反射是什麼呢?
當我們的程式在執行時,需要動態的載入一些類這些類可能之前用不到,所以不用載入到jvm,而是在執行時根據需要才載入。
Java反射的應用場景
面向開發,反射應用最廣泛的是中介軟體和框架,比如:
JDBC的Class.forName(driverClass)載入驅動;
Spring MVC 透過反射呼叫 controller 的方法,動態代理處理請求;
Spring IOC 容器,在建立 Bean 例項時和依賴注入時的反射。
RMI 反序列化,反射呼叫遠端方法;
RPC Dubbo動態代理利用;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2930747/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript事件機制底層實現原理JavaScript事件
- 詳解 php 反射機制原理PHP反射
- Java 併發機制底層實現 —— volatile 原理、synchronize 鎖優化機制Java優化
- 深入詳細瞭解synchronized底層原理synchronized
- iOS底層原理總結篇-- 深入理解 KVC\KVO 實現機制iOS
- 深入理解Java中的底層阻塞原理及實現Java
- Java註解與反射機制Java反射
- 詳解鎖原理,synchronized、volatile+cas底層實現synchronized
- 面試官:說說反射的底層實現原理?面試反射
- volatile底層原理詳解
- Java進階 | 泛型機制與反射原理Java泛型反射
- HashMap原理詳解,包括底層原理HashMap
- 併發機制的底層實現
- 深入分析Java中的PriorityQueue底層實現與原始碼Java原始碼
- java基礎:深入理解Class物件與反射機制Java物件反射
- 高效能的Redis之物件底層實現原理詳解Redis物件
- HashMap底層實現原理HashMap
- NSDictionary底層實現原理
- AutoreleasePool底層實現原理
- Java 型別資訊詳解和反射機制Java型別反射
- 【併發程式設計】(二)Java併發機制底層實現原理——synchronized關鍵字程式設計Javasynchronized
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- php底層原理之垃圾回收機制PHP
- 基礎篇:深入解析JAVA反射機制Java反射
- Mysql鎖機制與最佳化實踐以及MVCC底層原理剖析MySqlMVC
- React-Router底層原理分析與實現React
- 利用反射機制實現依賴注入的原理反射依賴注入
- Java併發容器,底層原理深入分析Java
- day13-實現Spring底層機制-03Spring
- Redisson的看門狗機制底層實現Redis
- ArrayList底層的實現原理
- MySQL索引底層實現原理MySql索引
- 基礎篇:詳解鎖原理,volatile+cas、synchronized的底層實現synchronized
- 十分鐘快速掌握HashMap底層實現原理(圖文詳解)HashMap
- JS 反射機制及 Reflect 詳解JS反射
- 深入理解 MySQL 底層實現MySql
- 【深入 PHP】PHP7 底層執行機制PHP
- iOS開發·KVO用法,原理與底層實現: runtime模擬實現KVO監聽機制(Blcok及Delgate方式)iOS