成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說反射的底層實現原理?

開發 后端
本文就通過大白話的方式來系統的講解一下反射,希望大家看完之后能真正的理解并掌握“反射”這項技術。反射在程序運行期間動態獲取類和操縱類的一種技術。

反射是 Java 面試中必問的面試題,但只有很少人能真正的理解“反射”并講明白反射,更別說能說清楚它的底層實現原理了。所以本文就通過大白話的方式來系統的講解一下反射,希望大家看完之后能真正的理解并掌握“反射”這項技術。

1.什么是反射?

反射在程序運行期間動態獲取類和操縱類的一種技術。

2.反射的應用有哪些?

反射在日常開發中使用的地方有很多,例如以下幾個:

  • 動態代理:反射是動態代理的底層實現,即在運行時動態地創建代理對象,并攔截和增強方法調用。這常用于實現 AOP 功能,如日志記錄、事務管理等。
  • Bean 創建:Spring/Spring Boot 項目中,在項目啟動時,創建的 Bean 對象就是通過反射來實現的。
  • JDBC 連接:JDBC 中的 DriverManager 類通過反射加載并注冊數據庫驅動,這是 Java 數據庫連接的標準做法。

3.反射實現

反射的關鍵實現方法有以下幾個:

  • 得到類:Class.forName("類名")
  • 得到所有字段:getDeclaredFields()
  • 得到所有方法:getDeclaredMethods()
  • 得到構造方法:getDeclaredConstructor()
  • 得到實例:newInstance()
  • 調用方法:invoke()

具體使用示例如下:

// 1.反射得到對象
Class<?> clazz = Class.forName("User");
// 2.得到方法
Method method = clazz.getDeclaredMethod("publicMethod");
// 3.得到靜態方法
Method staticMethod = clazz.getDeclaredMethod("staticMethod");
// 4.執行靜態方法
staticMethod.invoke(clazz);

反射執行私有方法代碼實現如下:

// 1.反射得到對象
Class<?> clazz = Class.forName("User");
// 2.得到私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
// 3.設置私有方法可訪問
privateMethod.setAccessible(true);
// 4.得到實例
Object user = clazz.getDeclaredConstructor().newInstance();
// 5.執行私有方法
privateMethod.invoke(user);

4.底層實現原理

從上述內容可以看出,對于反射來說,操縱類最主要的方法是 invoke,所以搞懂了 invoke 方法的實現,也就搞定了反射的底層實現原理了。

invoke 方法的執行流程如下:

  • 查找方法:當通過 java.lang.reflect.Method 對象調用 invoke 方法時,Java 虛擬機(JVM)首先確認該方法是否存在并可以訪問。這包括檢查方法的訪問權限、方法簽名是否匹配等。
  • 安全檢查:如果方法是私有的或受保護的,還需要進行訪問權限的安全檢查。如果當前調用者沒有足夠的權限訪問這個方法,將拋出 IllegalAccessException。
  • 參數轉換和適配:invoke 方法接受一個對象實例和一組參數,需要將這些參數轉換成對應方法簽名所需要的類型,并且進行必要的類型檢查和裝箱拆箱操作。
  • 方法調用:對于非私有方法,Java 反射實際上是通過 JNI(Java Native Interface,Java 本地接口)調用到 JVM 內部的 native 方法,例如 java.lang.reflect.Method.invoke0()。這個 native 方法負責完成真正的動態方法調用。對于 Java 方法,JVM 會通過方法表、虛方法表(vtable)進行查找和調用;對于非虛方法或者靜態方法,JVM 會直接調用相應的方法實現。
  • 異常處理:在執行方法的過程中,如果出現任何異常,JVM 會捕獲并將異常包裝成 InvocationTargetException 拋出,應用程序可以通過這個異常獲取到原始異常信息。
  • 返回結果:如果方法正常執行完畢,invoke 方法會返回方法的執行結果,或者如果方法返回類型是 void,則不返回任何值。

通過這種方式,Java 反射的 invoke 方法能夠打破編譯時的綁定,實現運行時動態調用對象的方法,提供了極大的靈活性,但也帶來了運行時性能損耗和安全隱患(如破壞封裝性、違反訪問控制等)。

5.優缺點分析

反射的優點如下:

  • 靈活性:使用反射可以在運行時動態加載類,而不需要在編譯時就將類加載到程序中。這對于需要動態擴展程序功能的情況非常有用。
  • 可擴展性:使用反射可以使程序更加靈活和可擴展,同時也可以提高程序的可維護性和可測試性。
  • 實現更多功能:許多框架都使用反射來實現自動化配置和依賴注入等功能。例如,Spring 框架就使用反射來實現依賴注入。

反射的缺點如下:

  • 性能問題:使用反射會帶來一定的性能問題,因為反射需要在運行時動態獲取類的信息,這比在編譯時就獲取信息要慢。
  • 安全問題:使用反射可以訪問和修改類的字段和方法,這可能會導致安全問題。因此,在使用反射時需要格外小心,確保不會對程序的安全性造成影響。
責任編輯:姜華 來源: Java中文社群
相關推薦

2024-02-29 16:49:20

volatileJava并發編程

2024-08-29 16:30:27

2025-04-08 00:00:00

@AsyncSpring異步

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2024-09-04 17:35:09

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-08-12 17:36:54

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-03-06 15:38:06

Spring微服務架構擴展組件

2020-11-30 11:01:34

反射用途實現

2020-07-02 07:52:11

RedisHash映射

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-06-04 09:02:03

2025-02-28 00:00:00

2021-06-07 17:12:22

線程安全Atomic

2021-05-20 08:34:03

CDN原理網絡

2024-03-01 11:33:31

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九久久99 | 男人天堂网址 | 日本特黄a级高清免费大片 特黄色一级毛片 | 国产精品1区2区 | 国产一区二区精品在线 | 日本中文字幕在线视频 | 国产美女精品 | 婷婷五月色综合 | 正在播放亚洲 | 久久亚洲国产精品 | 午夜日韩视频 | 国产精品久久精品 | 伊人久久一区二区 | 国产日韩久久久久69影院 | 瑟瑟视频在线看 | aaaaaa大片免费看最大的 | 久草精品视频 | 精品网 | 99综合网| 黄色操视频| 毛片黄| 91成人在线视频 | 国产资源一区二区三区 | 中文字幕亚洲在线 | 亚洲国产精品va在线看黑人 | 欧美色偷拍 | 精品久久中文 | 天天操天天射综合网 | 欧美一级片在线播放 | 欧美日韩一区在线 | 久久夜视频 | 欧美精品在线播放 | 欧美黄色一区 | 欧美黑人巨大videos精品 | 国产精品欧美一区二区三区 | 99国产精品99久久久久久 | www免费视频 | 精品不卡 | 日韩视频一区在线观看 | 亚洲一区二区三区 | 91在线精品视频 |