日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java 反射:讓你更優雅的使用框架!

來源: 責編: 時間:2024-05-24 17:23:32 244觀看
導讀在 Java語言中,反射是一種強大而優秀的機制,通過反射,我們可以在運行時檢查和修改類、接口、字段和方法的信息,甚至動態地創建對象、調用方法和訪問私有成員。可以毫不夸張地說,沒有反射,很多優秀的框架不復存在,沒有這些優

在 Java語言中,反射是一種強大而優秀的機制,通過反射,我們可以在運行時檢查和修改類、接口、字段和方法的信息,甚至動態地創建對象、調用方法和訪問私有成員。uEb28資訊網——每日最新資訊28at.com

可以毫不夸張地說,沒有反射,很多優秀的框架不復存在,沒有這些優秀的框架(比如Spring),Java可能會遜色很多,因此,這篇文章,我們一起來深入探討Java反射以及其背后的原理。uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

一、什么是反射

先看看 Oracle官方對java反射的說明:uEb28資訊網——每日最新資訊28at.com

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.uEb28資訊網——每日最新資訊28at.com

Java 的反射機制是指在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法;并且對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取信息以及動態調用對象方法的功能成為Java語言的反射機制。uEb28資訊網——每日最新資訊28at.com

它是通過 Java反射 API 來實現,其中最核心的類位于 java.lang.reflect 包下,如 Class、Constructor、Field 和 Method等,這些類提供了對類和對象的運行時信息進行檢查和操作的方法。如下圖,展示了 JDK源碼中 java.lang.reflect 包所有的類:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

二、反射的原理

反射的原理主要可以從下面 4個點來闡述:uEb28資訊網——每日最新資訊28at.com

  • 類加載:當 Java程序運行時,類加載器會根據類的名稱查找并加載類的字節碼文件,然后將字節碼文件轉換為可執行的 Java類,并將其存儲在運行時數據區域的方法區中。
  • 創建 Class對象:在類加載過程中,Java虛擬機會自動創建對應的Class對象,Class對象包含了類的元數據信息,并提供了訪問和操作類的接口。
  • 獲取 Class對象:Class對象通過多種方式獲取,最常見的方式有 3種: 類的 .class屬性、類實例的 getClass()方法、Class.forName()。
  • 訪問和操作:通過Class對象獲取類的字段、方法、構造函數等信息,使用Field類和Method類來訪問和操作字段和方法,甚至可以調用私有的字段和方法。

通過上述的分析可以看出:反射機制需要基于Java虛擬機對類的加載、存儲和訪問機制的支持,通過反射,可以在運行時動態地探索和操作類的信息,實現靈活的編程和代碼的動態行為。uEb28資訊網——每日最新資訊28at.com

三、如何使用反射

在講解了 Java反射原理之后,我們通過一個真實的例子來展示如何使用 Java反射機制。如下示例 demo,通過反射給 Person 類中的 greet() 方法傳入一個 name,然后輸出:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

過程分析:uEb28資訊網——每日最新資訊28at.com

  • 首先,在示例代碼通過獲Person.class取了 Person的Class對象;
  • 然后,使用clazz.getName()獲取了類的名稱,通過clazz.getModifiers()獲取了類的修飾符,并打印輸出;
  • 接下來,通過clazz.getDeclaredMethods()獲取類的所有方法,并依次打印輸出方法的名稱;
  • 接著,通過clazz.getDeclaredConstructor().newInstance()方法創建了 Person 的實例;
  • 再接著,使用clazz.getDeclaredMethod()方法獲取了 greet()方法的引用。為了調用私有方法,我們需要調用setAccessible(true)來設置方法的可訪問性。
  • 最后,使用Method.invoke()方法調用了 greet()方法,傳遞參數name = Java。

運行示例結果如下圖:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

上述示例,我們通過詳細的步驟展示了如何使用反射獲取類的信息和動態調用方法。你也可以嘗試在 Person 中添加更多的方法和字段,并使用反射來獲取和操作它們。uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

四、部分源碼解讀

在上述示例講解時,最后是調用 Method.invoke() 實現 Person.greet()的調用,因此,這里我們主要分析 invoke()方案,官方源碼截圖:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

從上面源碼截圖看出:Method.invoke() 方法,真實返回的是接口 MethodAccessor.invoke()方法。MethodAccessor 接口有三個實現類,具體是調用哪個類的 invoke 方法?uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

進入acquireMethodAccessor方法,可以看到MethodAccessor由ReflectionFactory 的 newMethodAccessor方法決定。uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

再進入 DelegatingMethodAccessorImpl 的 invoke方法:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

DelegatingMethodAccessorImpl的invoke方法返回的是MethodAccessorImpl的invoke方法,而MethodAccessorImpl的invoke方法,由它的子類NativeMethodAccessorImpl重寫,這時候返回的是native invoke0,如下圖:uEb28資訊網——每日最新資訊28at.com

uEb28資訊網——每日最新資訊28at.com

跟到源碼最后可以發現:Method.invoke()方法最終調用 native的invoke0(),應用層面的操作最終轉換成對操作系統 c/c++方法的調用。uEb28資訊網——每日最新資訊28at.com

五、反射優缺點

上面內容的講解已經側面反映出了Java反射的一些優點,這里再詳細的總結下反射的優缺點:uEb28資訊網——每日最新資訊28at.com

優點:uEb28資訊網——每日最新資訊28at.com

  • 動態性:反射允許我們在運行時動態地獲取和操作類的信息,而不需要在編譯時確定。這為編寫靈活的、可擴展的代碼提供了便利。
  • 靈活性:通過反射,我們可以繞過訪問修飾符的限制,訪問和修改私有成員、調用私有方法等。這為我們在特殊情況下進行一些高級操作提供了可能。
  • 框架開發:反射在開發框架和庫時非常有用。通過反射,框架可以動態地加載和實例化類,解析注解,處理回調等。這為框架提供了更大的靈活性和可擴展性。
  • 調試和探索:反射使得我們可以在運行時探索代碼背后的信息,例如獲取類的結構、方法、字段等。這對于調試和理解復雜的代碼非常有幫助。

uEb28資訊網——每日最新資訊28at.com

缺點:uEb28資訊網——每日最新資訊28at.com

  • 性能開銷:相比于直接調用代碼,使用反射會帶來更高的性能開銷。反射涉及到動態查找、方法調用等操作,這些操作比直接調用代碼更加耗時。因此,在對性能要求較高的場景下,過度使用反射可能導致性能下降。
  • 安全性和穩定性:反射打破了封裝性和類型安全性,通過反射,我們可以繞過訪問修飾符的限制,調用私有方法等,這可能導致代碼的不穩定性和安全隱患。因此,使用反射時需要格外小心,確保代碼的正確性和穩定性。

從整體上看,Java反射是以犧牲了小部分的性能換取了更好的擴展性和靈活性,犧牲小我成就大我,而且,隨著現代硬件設備能力越來越強,這點小性能的犧牲是完全值得的。uEb28資訊網——每日最新資訊28at.com

六、為什么需要反射 

反射機制在 Java中的作用不言而喻,下面列舉了反射機制的一些常見場景和原因:uEb28資訊網——每日最新資訊28at.com

  • 運行時類型檢查:反射機制允許在運行時獲取類的信息,包括字段、方法和構造方法等。因此,在進行運行時類型檢查,以確保代碼在處理不同類型的對象時能夠正確地進行操作。
  • 動態創建對象:通過反射,可以在運行時動態地創建對象,而不需要在編譯時知道具體的類名。這對于某些需要根據條件或配置來創建對象的情況非常有用,例如工廠模式或依賴注入框架。
  • 訪問和修改私有成員:反射機制可以繞過訪問權限限制,訪問和修改類的私有字段和方法。雖然這破壞了封裝性原則,但在某些特定情況下,這種能力可以幫助我們進行一些特殊操作,例如單元測試、調試或框架的內部實現。
  • 動態調用方法:反射機制允許我們在運行時動態地調用類的方法,甚至可以根據運行時的條件來選擇不同的方法。這對于實現插件化系統、處理回調函數或實現動態代理等功能非常有用。
  • 框架和庫的實現:許多Java框架和庫在其實現中廣泛使用了反射機制。它們利用反射來自動發現和加載類、實現依賴注入、處理注解、配置文件解析和動態代理等。反射機制使得這些框架和庫更加靈活和擴展。

uEb28資訊網——每日最新資訊28at.com

七、常用框架 

很多優秀的框架內部都使用了Java反射,這里重點講解下給 Java打下半壁江山的 Spring生態(Spring Framework,Spring MVC,SpringBoot, SpringCloud...),以 Spring Framework為例:uEb28資訊網——每日最新資訊28at.com

  • 依賴注入(Dependency Injection) : 依賴注入,可以把程序員主動創建對象的事情交給 Spring管理,大大提升了對象創建的靈活性。當我們在配置文件或用注解定義 Bean時,Spring會使用反射來動態地實例化對象,并將依賴的其他對象注入到這些實例中。
  • 自動裝配(Autowired) : 當 Spring容器啟動時,它會掃描應用程序中的所有類,并使用反射來查找和識別帶有 @Autowired注解的字段、方法或構造函數。再自動將 Bean注入到需要的位置,實現對象之間的自動連接。
  • AOP(Aspect-Oriented Programming) : AOP 利用了動態代理和反射機制。通過定義切面(Aspect)和切點(Pointcut),Spring可以在運行時使用反射來創建代理對象,從而實現橫切關注點(cross-cutting concerns)的功能,如日志記錄、事務管理等。
  • 動態代理(Dynamic Proxy) : Spring利用 Java反射機制動態地創建代理對象,并在代理對象中添加額外的邏輯,從而實現對目標對象的增強。
  • 框架擴展和定制: Spring通過反射機制來實現對應用程序的擴展和定制的。例如,Spring提供了BeanPostProcessor接口,允許開發人員在 Bean初始化前后插入自定義邏輯,這是通過反射來實現的。

另外,還有一些耳熟能詳的框架也使用了Java反射:uEb28資訊網——每日最新資訊28at.com

  • JUnit:JUnit是一個優秀的單元測試框架,它利用了 Java反射機制動態地加載和執行測試方法。
  • Jackson:Jackson是一個 JSON處理的 Java庫,它利用反射來實現 JSON與 Java對象之間的轉換,動態讀取和寫入 Java對象的屬性,并將其轉換為 JSON格式。
  • Hibernate ORM:Hibernate和 MyBatis一樣,都是對象關系映射框架,通過反射來實現對象與數據庫表之間的映射關系。

uEb28資訊網——每日最新資訊28at.com

八、總結 

uEb28資訊網——每日最新資訊28at.com

本文講解了Java反射的原理和使用方式,因為有了Java反射,很多優秀的框架應運而生,從而使得 Java 生態越來越完善,因此,反射是絕大多數框架的基石。uEb28資訊網——每日最新資訊28at.com

Java反射有優點也有缺點,從整體上看,Java反射是以犧牲了小部分的性能換取了更好的擴展性和靈活性,犧牲小我成就大我,而且,隨著現代硬件設備能力越來越強,這點小性能的犧牲是完全值得的。uEb28資訊網——每日最新資訊28at.com

掌握Java反射,我們可以更好的理解一些優秀框架的運行機制,比如:Spring。它可以幫助我們更好的使用框架,遇到問題時也能更好的去分析和解決。uEb28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-90660-0.htmlJava 反射:讓你更優雅的使用框架!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python 中 URL 處理的常見問題及解決方案,值得收藏!

下一篇: 京東面試:SpringBoot同時可以處理多少請求?

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統將于今天下午正式登場,官方在發布會之前也已經正式給出了可升級的機型產品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機發布會上,除了兩款手機新品之外,Redmi還帶來了兩款TWS真無線藍牙耳機產品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事“起猛了,我能看得懂日語了”。“為什么日本人說話我能聽懂?”“中文不像中文,日語不像日語,但是我竟然看懂了”…&hell
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久久久免费| 99精品国产在热久久婷婷| 欧美日韩亚洲一区二区三区在线 | 久久激情视频| 久久综合九色九九| 欧美日韩日日骚| 国产一区av在线| 亚洲精品欧美精品| 国产精品国产三级国产普通话蜜臀| 国产精品试看| 1000部精品久久久久久久久| 亚洲美女黄网| 久久国产欧美精品| 欧美韩日一区二区| 国产精品网站一区| 亚洲第一精品夜夜躁人人躁| 国产精品99久久久久久宅男| 久久九九久精品国产免费直播| 欧美激情精品| 国产欧美一区二区精品婷婷| 亚洲日本久久| 欧美一区二区三区免费观看| 欧美成人免费小视频| 国产精品一区二区在线观看| 亚洲人成啪啪网站| 久久精品免费| 欧美四级在线观看| 亚洲国产精品尤物yw在线观看 | 亚洲裸体俱乐部裸体舞表演av| 亚洲欧美日韩天堂一区二区| 欧美3dxxxxhd| 国产视频一区在线| 在线亚洲一区| 蜜桃久久av| 国产深夜精品| 亚洲视频1区| 免费欧美电影| 国产一区二区| 亚洲欧美日韩在线综合| 欧美激情视频给我| 黄色av成人| 性18欧美另类| 欧美视频1区| 亚洲欧洲在线视频| 久久婷婷色综合| 国产欧美 在线欧美| 艳女tv在线观看国产一区| 美女91精品| 国产综合在线视频| 小嫩嫩精品导航| 国产精品成人aaaaa网站| 亚洲激情黄色| 六月丁香综合| 国产专区精品视频| 亚洲女性喷水在线观看一区| 欧美日韩精品在线播放| 亚洲三级免费| 女人香蕉久久**毛片精品| 国内成人自拍视频| 新67194成人永久网站| 欧美视频中文字幕在线| 亚洲裸体俱乐部裸体舞表演av| 欧美不卡在线视频| 伊人精品成人久久综合软件| 一区二区视频欧美| 欧美一区二区三区视频| 国产精品国码视频| 亚洲视频第一页| 欧美日韩国产精品专区| 91久久精品久久国产性色也91 | 美女福利精品视频| 国内一区二区三区在线视频| 欧美影院视频| 国产日韩在线亚洲字幕中文| 亚洲欧美日韩精品久久奇米色影视 | 激情丁香综合| 性色av一区二区三区在线观看 | 久久精品国产亚洲aⅴ| 国产啪精品视频| 欧美一区影院| 国产一区二区三区奇米久涩| 久久精品久久99精品久久| 国模精品一区二区三区| 久久久久国产免费免费| 精品69视频一区二区三区| 久久免费国产精品1| 在线观看欧美亚洲| 欧美成人r级一区二区三区| 亚洲人体1000| 欧美肉体xxxx裸体137大胆| 一区二区国产精品| 国产精品国产三级国产aⅴ入口 | 美女国内精品自产拍在线播放| 在线欧美不卡| 欧美激情片在线观看| 夜夜嗨一区二区三区| 国产精品sm| 亚洲欧美日韩国产| 国产真实乱子伦精品视频| 久久在精品线影院精品国产| 亚洲国产精品嫩草影院| 欧美区一区二区三区| 在线一区欧美| 国产精品网曝门| 久久久久国产一区二区三区| 亚洲国产91色在线| 欧美日韩国产在线播放| 亚洲砖区区免费| 国产一区999| 欧美国产精品| 亚洲图片在区色| 国产一级精品aaaaa看| 欧美chengren| 亚洲一区二区av电影| 国产亚洲综合精品| 欧美高清在线一区二区| 中文精品一区二区三区| 国产欧美视频一区二区| 美女图片一区二区| 亚洲午夜电影在线观看| 韩国av一区二区三区| 欧美激情偷拍| 小黄鸭精品aⅴ导航网站入口| 影音欧美亚洲| 欧美吻胸吃奶大尺度电影| 久久精品日产第一区二区| 亚洲人成精品久久久久| 国产精品自在欧美一区| 猛干欧美女孩| 午夜电影亚洲| 亚洲破处大片| 国产欧美日韩在线播放| 欧美va天堂va视频va在线| 亚洲一级电影| 亚洲国产成人精品女人久久久 | 激情懂色av一区av二区av| 欧美人成在线| 久久精品中文字幕一区| 亚洲每日更新| 国产一区二区三区免费不卡| 欧美久久视频| 久久久久久亚洲精品中文字幕| 一区二区不卡在线视频 午夜欧美不卡在 | 韩国成人理伦片免费播放| 欧美激情第10页| 欧美一区二区在线免费播放| 亚洲精选中文字幕| 国产一区导航| 国产精品成人观看视频免费| 榴莲视频成人在线观看| 亚洲欧美文学| 日韩午夜电影在线观看| 国产综合久久久久久鬼色| 欧美精品999| 久久久国产精彩视频美女艺术照福利| 一区二区三区www| 1024精品一区二区三区| 国产欧美日韩精品专区| 欧美日韩国产综合网 | 欧美视频官网| 欧美粗暴jizz性欧美20| 久久九九精品| 西西人体一区二区| 中文网丁香综合网| 亚洲三级视频| 亚洲福利精品| 韩国一区电影| 国产美女精品一区二区三区| 欧美视频二区36p| 欧美激情第三页| 狂野欧美激情性xxxx| 久久黄色网页| 亚洲女女做受ⅹxx高潮| 亚洲免费精品| 亚洲人成人99网站| 1024亚洲| 国产综合色产| 国产在线国偷精品产拍免费yy| 国产精品一国产精品k频道56| 欧美三级电影网| 欧美日韩精品免费在线观看视频| 欧美xx69| 欧美成人精品h版在线观看| 久久香蕉国产线看观看av| 久久精品动漫| 久久精品99国产精品酒店日本| 亚洲欧美在线aaa| 亚洲综合日本| 亚洲欧美国产日韩中文字幕| 亚洲视频一区二区免费在线观看| 99av国产精品欲麻豆| 亚洲精选视频在线| 99国产精品国产精品毛片| 91久久午夜| 亚洲欧洲一区二区三区久久| 亚洲欧洲精品一区二区| 亚洲激情成人网| 亚洲人成欧美中文字幕| 亚洲三级网站| 一本色道久久综合| 亚洲深夜av| 午夜精品网站| 欧美在线视频导航| 久久精品欧美日韩精品|