欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java反射機(jī)制的適用場(chǎng)景及利弊詳解

 更新時(shí)間:2023年08月12日 09:30:01   作者:zolalad  
這篇文章主要介紹了Java反射機(jī)制的適用場(chǎng)景及利弊詳解,Spring用到很多反射機(jī)制,在xml文件或者properties里面寫(xiě)好了配置,然后在Java類(lèi)里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串,然后用反射機(jī)制,需要的朋友可以參考下

一、反射的適用場(chǎng)景是什么?

  1. Java的反射機(jī)制在做基礎(chǔ)框架的時(shí)候非常有用,有一句話(huà)這么說(shuō)來(lái)著:反射機(jī)制是很多Java框架的基石。而一般應(yīng)用層面很少用,不過(guò)這種東西,現(xiàn)在很多開(kāi)源框架基本都已經(jīng)給你封裝好了,自己基本用不著寫(xiě)。典型的除了Hibernate之外,還有Spring也用到很多反射機(jī)制。經(jīng)典的就是在xml文件或者properties里面寫(xiě)好了配置,然后在Java類(lèi)里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串,然后用反射機(jī)制,根據(jù)這個(gè)字符串獲得某個(gè)類(lèi)的Class實(shí)例,這樣就可以動(dòng)態(tài)配置一些東西,不用每一次都要在代碼里面去new或者做其他的事情,以后要改的話(huà)直接改配置文件,代碼維護(hù)起來(lái)就很方便了,同時(shí)有時(shí)候要適應(yīng)某些需求,Java類(lèi)里面不一定能直接調(diào)用另外的方法,這時(shí)候也可以通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)。 總的來(lái)說(shuō),自己寫(xiě)的很少,具體什么時(shí)候要用那要看需求,反射機(jī)制無(wú)非就是根據(jù)一個(gè)String來(lái)得到你要的實(shí)體對(duì)象,然后調(diào)用它原來(lái)的東西。但是如果是要自己寫(xiě)框架的話(huà),那就會(huì)用得比較多了。
  2. 當(dāng)你做一個(gè)軟件可以安裝插件的功能,你連插件的類(lèi)型名稱(chēng)都不知道,你怎么實(shí)例化這個(gè)對(duì)象呢?因?yàn)槌绦蚴侵С植寮模ǖ谌降模?,在開(kāi)發(fā)的時(shí)候并不知道 。所以無(wú)法在代碼中 New出來(lái) ,但反射可以,通過(guò)反射,動(dòng)態(tài)加載程序集,然后讀出類(lèi),檢查標(biāo)記之后再實(shí)例化對(duì)象,就可以獲得正確的類(lèi)實(shí)例。
  3. 在編碼階段不知道那個(gè)類(lèi)名,要在運(yùn)行期從配置文件讀取類(lèi)名, 這時(shí)候就沒(méi)有辦法硬編碼new ClassName(),而必須用到反射才能創(chuàng)建這個(gè)對(duì)象.反射的目的就是為了擴(kuò)展未知的應(yīng)用。比如你寫(xiě)了一個(gè)程序,這個(gè)程序定義了一些接口,只要實(shí)現(xiàn)了這些接口的dll都可以作為插件來(lái)插入到這個(gè)程序中。那么怎么實(shí)現(xiàn)呢?就可以通過(guò)反射來(lái)實(shí)現(xiàn)。就是把dll加載進(jìn)內(nèi)存,然后通過(guò)反射的方式來(lái)調(diào)用dll中的方法。很多工廠模式就是使用的反射。 

二、程序員在自己的業(yè)務(wù)開(kāi)發(fā)中應(yīng)該盡量的遠(yuǎn)離反射

反射:在流行的庫(kù)如Spring和Hibernate中,反射自然有其用武之地。

不過(guò)內(nèi)省業(yè)務(wù)代碼在很多時(shí)候都不是一件好事,原因有很多,一般情況下我總是建議大家不要使用反射。

首先是代碼可讀性與工具支持。打開(kāi)熟悉的IDE,尋找你的Java代碼的內(nèi)部依賴(lài),很容易吧

?,F(xiàn)在,使用反射來(lái)替換掉你的代碼然后再試一下,結(jié)果如何呢?如果通過(guò)反射來(lái)修改已經(jīng)封裝好的對(duì)象狀態(tài),那么結(jié)果將會(huì)變得更加不可控。請(qǐng)看看如下示例代碼:

如果這樣做就無(wú)法得到編譯期的安全保證。就像上面這個(gè)示例一樣,你會(huì)發(fā)現(xiàn)如果getDeclaredField()方法調(diào)用的參數(shù)輸錯(cuò)了,那么只有在運(yùn)行期才能發(fā)現(xiàn)。

要知道的是,尋找運(yùn)行期Bug的難度要遠(yuǎn)遠(yuǎn)超過(guò)編譯期的Bug。

最后還要談?wù)劥鷥r(jià)問(wèn)題。JIT對(duì)反射的優(yōu)化程度是不同的,有些優(yōu)化時(shí)間會(huì)更長(zhǎng)一些,而有些甚至是無(wú)法應(yīng)用優(yōu)化。

因此,有時(shí)反射的性能損失可以達(dá)到幾個(gè)數(shù)量級(jí)的差別。不過(guò)在典型的業(yè)務(wù)應(yīng)用中,你可能不會(huì)注意到這個(gè)代價(jià)。

總結(jié)一下,我覺(jué)得在業(yè)務(wù)代碼中唯一合理(直接)使用反射的場(chǎng)景是通過(guò)AOP。除此之外,你最好遠(yuǎn)離反射這一特性。

三、性能分析

反射機(jī)制是一種程序自我分析的能力。用于獲取一個(gè)類(lèi)的類(lèi)變量,構(gòu)造函數(shù),方法,修飾符。

優(yōu)點(diǎn):運(yùn)行期類(lèi)型的判斷,動(dòng)態(tài)類(lèi)加載,動(dòng)態(tài)代理使用反射。

缺點(diǎn):性能是一個(gè)問(wèn)題,反射相當(dāng)于一系列解釋操作,通知jvm要做的事情,性能比直接的java代碼要慢很多。

到此這篇關(guān)于Java反射機(jī)制的適用場(chǎng)景及利弊詳解的文章就介紹到這了,更多相關(guān)Java反射機(jī)制場(chǎng)景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot配置文件中屬性變量引用方式@@解讀

    springboot配置文件中屬性變量引用方式@@解讀

    這篇文章主要介紹了springboot配置文件中屬性變量引用方式@@解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Java排序算法中的冒泡和選擇排序

    詳解Java排序算法中的冒泡和選擇排序

    這篇文章主要給大家介紹了Java排序算法中的冒泡排序和選擇排序,文中有詳細(xì)的圖文解釋和代碼示例,對(duì)我們學(xué)習(xí)Java算法有一定的幫助,感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • Java程序員容易犯的10大低級(jí)錯(cuò)誤

    Java程序員容易犯的10大低級(jí)錯(cuò)誤

    這篇文章主要介紹了Java程序員容易犯的10大低級(jí)錯(cuò)誤,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • java基于反射得到對(duì)象屬性值的方法

    java基于反射得到對(duì)象屬性值的方法

    這篇文章主要介紹了java基于反射得到對(duì)象屬性值的方法,結(jié)合實(shí)例形式分析了java基于反射獲取對(duì)象屬性值的相關(guān)實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2017-03-03
  • Mybatis中單雙引號(hào)引發(fā)的慘案及解決

    Mybatis中單雙引號(hào)引發(fā)的慘案及解決

    這篇文章主要介紹了Mybatis中單雙引號(hào)引發(fā)的慘案及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springmvc中進(jìn)行數(shù)據(jù)保存以及日期參數(shù)的保存過(guò)程解析

    springmvc中進(jìn)行數(shù)據(jù)保存以及日期參數(shù)的保存過(guò)程解析

    這篇文章主要介紹了springmvc中進(jìn)行數(shù)據(jù)保存以及日期參數(shù)的保存過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot下載文件的正確解法方式

    SpringBoot下載文件的正確解法方式

    這篇文章主要給大家介紹了關(guān)于SpringBoot下載文件的正確解法方式,SpringBoot是一款流行的框架,用于開(kāi)發(fā)Web應(yīng)用程序,在使用SpringBoot構(gòu)建Web應(yīng)用程序時(shí),可能需要實(shí)現(xiàn)文件下載的功能,需要的朋友可以參考下
    2023-08-08
  • JPA中@CreatedDate和@LastModifiedDate的使用方式

    JPA中@CreatedDate和@LastModifiedDate的使用方式

    這篇文章主要介紹了JPA中@CreatedDate和@LastModifiedDate的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理

    Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理

    本文介紹了Springboot異步任務(wù)和定時(shí)任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時(shí)任務(wù)是經(jīng)常遇到的處理問(wèn)題方式,為了能夠用好這兩項(xiàng)配置,不干擾正常的業(yè)務(wù),需要對(duì)其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線(xiàn)程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下
    2022-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-11-11

最新評(píng)論