日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在Java開發(fā)做了10年后,才學會此絕招,用于顛覆Java應用

本文轉載自微信公眾號「小明菜市場」,可以通過以下二維碼關注。轉載本文請聯(lián)系小明菜市場公眾號。

什么是反射

一般情況下,需要一個功能的前提是遇到了什么問題,先列舉一些問題,再通過反射是如何解決這些問題。普通開發(fā)人員工作中最常遇到的問題是,需要生成代理對象。解決方法是:將需要加強的類,利用反射加載之后,與補充的邏輯進行融合,產(chǎn)生一個新的對象,這個對象就是代理對象,即具備原有的類以及新的邏輯的增強后的類。比如Man類里有個 eat 方法,我們希望執(zhí)行eat方法之前和之后都需要執(zhí)行洗手,洗碗,而又不能修改eat方法,這個時候就需要使用代理對象,在執(zhí)行eat之前和之后執(zhí)行這些操作。

應用場景

開發(fā)通用框架,反射最重要的用途就是開發(fā)各種通用框架,很多框架比如Spring,都是配置化的,為了保證框架的通用性,它們可能需要根據(jù)配置文件加載不同的對象和類,調用不同的方法,這個時候就需要使用反射,在運行時動態(tài)的加載需要的對象。動態(tài)代理,在切面編程中,需要攔截特定的方法,通常會使用動態(tài)代理,動態(tài)代理需要使用反射技術來實現(xiàn)。注解:注解也是使用了反射機制,根據(jù)注解的標記來調用注解解釋器,執(zhí)行行為,如果沒有反射機制,注解就會失效。可擴展功能,應用程序可以通過使用完全限定名稱創(chuàng)建可擴展的對象實例。

反射和代理涉及的術語

真實對象:就是原始類實例化后產(chǎn)生的對象,未經(jīng)過代理模式加強后的對象。代理對象:利用代理模式增強后的對象。動態(tài)代理類:代理對象邏輯處理器,即,增強的邏輯所處的位置,需要傳入真實對象產(chǎn)生關聯(lián)的動態(tài)代理對象。invocationHandler 接口:動態(tài)代理類需要實現(xiàn)這個接口,并且重寫 invoke方法,增強的邏輯在 invoke 方法里,每個代理類的實例都關聯(lián)到了一個 Handler,當我們調用代理對象的時候,會轉發(fā)到invocationHandler接口的invoke方法進行調用。Proxy:代理類,用于動態(tài)代理對象傳入之后,產(chǎn)生代理對象。

反射與代理關系

代理模式的主要作用產(chǎn)生代理對象從而實現(xiàn)增強后的方法,反射作為Java提供的特性,是實現(xiàn)代理模式的基礎,即,利用反射技術獲取和操作Java程序里的類,從而對這些類進行包裝盒加工,產(chǎn)生代理對象。獲取代理對象:第一步:調用 Proxy.newProxyInstance 獲得一個動態(tài)代理對象,其接收三個參數(shù),上個參數(shù)分別是

  1. ClassLoader 對象,定義哪個ClassLoader對象進行生成代理對象進行加載
  2. 一個 Interface 對象數(shù)組,表示我們需要給代理對象提供什么接口,如果給其提供一組接口,那么這個代理對象就利用了多態(tài)實現(xiàn)了該接口。通過多態(tài)就實現(xiàn)調用這組接口中的方法。3.一個InvocationHandler的實現(xiàn)類對象,表示的是當我這個動態(tài)代理對象在調用方法的時候,會關聯(lián)到哪一個invocationHandler的實現(xiàn)類對象上。第二步: 獲得代理對象的類對象 第三步: 獲得代理類的所有方法 第四步:通過代理對象調用實現(xiàn)類的方法,觸發(fā)我們的重點步驟,invocationHandler 接口的實現(xiàn)類的invoked方法,從而執(zhí)行實現(xiàn)類的方法。第五步:調用invocationHandler 接口 傳入了三個參數(shù),這三個參數(shù)分別為:
  3. proxy 指代我們所代理的那個真是對象。
  4. method 我們需要調用的方法
  5. args 需要傳入的參數(shù)

jdk 動態(tài)代理和CGLIB動態(tài)代理的區(qū)別

代理方式:通過繼承真實對象的類或者實現(xiàn)其所需要實現(xiàn)的接口,把增強的邏輯補充進去完成。jdk動態(tài)代理是通過實現(xiàn)接口完成,當一個類是通過實現(xiàn)接口產(chǎn)生,就是jdk動態(tài)代理。CGLIB動態(tài)代理通過繼承類完成,當一個類沒有實現(xiàn)接口,只能使用jdk動態(tài)代理。

Reflection框架

Java里提供了反射獲取類的各個屬性和方法的類,需要拿到類才能進行相應的操作,但是反射框架,Reflections 不但能獲取classpath下的類,還能根據(jù)特定的注解獲取。Reflections 通過掃描classpath,索引元數(shù)據(jù),并且允許在允許時查詢元數(shù)據(jù)。使用Reflections可以很輕松的獲取下面的元數(shù)據(jù)

  1. 某個類型的全部子類
  2. 只要類型,構造器,方法,字段上帶有特定的注解,便能獲取帶有這個注解的全部信息。
  3. 獲取所有匹配某個正則表達式的資源
  4. 獲取帶有特定簽名的方法,包括參數(shù),參數(shù)注解,返回類型。
  5. 獲取方法的名字,
  6. 獲取代理里所有的字段,方法名,構造器的使用

關于作者

我是小小,一個生于二線,活在一線的城市的程序猿,我是小小,我們下期再見。


網(wǎng)頁標題:在Java開發(fā)做了10年后,才學會此絕招,用于顛覆Java應用
路徑分享:http://www.dlmjj.cn/article/cdpdcch.html