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

在Java開(kāi)發(fā)做了10年后,才學(xué)會(huì)此絕招,用于顛覆Java應(yīng)用

開(kāi)發(fā) 后端
一般情況下,需要一個(gè)功能的前提是遇到了什么問(wèn)題,先列舉一些問(wèn)題,再通過(guò)反射是如何解決這些問(wèn)題。普通開(kāi)發(fā)人員工作中最常遇到的問(wèn)題是,需要生成代理對(duì)象。

[[350497]]

本文轉(zhuǎn)載自微信公眾號(hào)「小明菜市場(chǎng)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系小明菜市場(chǎng)公眾號(hào)。

什么是反射

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

應(yīng)用場(chǎng)景

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

反射和代理涉及的術(shù)語(yǔ)

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

反射與代理關(guān)系

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

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

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

代理方式:通過(guò)繼承真實(shí)對(duì)象的類(lèi)或者實(shí)現(xiàn)其所需要實(shí)現(xiàn)的接口,把增強(qiáng)的邏輯補(bǔ)充進(jìn)去完成。jdk動(dòng)態(tài)代理是通過(guò)實(shí)現(xiàn)接口完成,當(dāng)一個(gè)類(lèi)是通過(guò)實(shí)現(xiàn)接口產(chǎn)生,就是jdk動(dòng)態(tài)代理。CGLIB動(dòng)態(tài)代理通過(guò)繼承類(lèi)完成,當(dāng)一個(gè)類(lèi)沒(méi)有實(shí)現(xiàn)接口,只能使用jdk動(dòng)態(tài)代理。

Reflection框架

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

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

關(guān)于作者

我是小小,一個(gè)生于二線,活在一線的城市的程序猿,我是小小,我們下期再見(jiàn)。

 

責(zé)任編輯:武曉燕 來(lái)源: 小明菜市場(chǎng)
相關(guān)推薦

2018-12-07 15:50:52

Java編程語(yǔ)言框架

2024-07-02 12:25:01

2020-08-31 11:10:57

編程語(yǔ)言PythonJava

2018-05-25 16:32:45

Spring BootJava開(kāi)發(fā)

2016-10-14 14:16:28

Spring BootJava應(yīng)用

2016-04-13 10:52:12

2019-08-21 09:00:00

2019-07-12 15:21:21

加密貨幣銀行貨幣

2024-06-07 11:14:24

2009-09-22 09:25:45

Chrome谷歌

2015-07-20 10:02:57

Java團(tuán)隊(duì)領(lǐng)導(dǎo)人

2018-05-31 15:30:11

JavaSpring Boot應(yīng)用開(kāi)發(fā)

2023-12-26 14:18:08

2023-05-11 10:34:42

JavaKotlinJavaScript

2020-12-21 14:40:10

Java技術(shù)開(kāi)發(fā)

2024-12-26 07:00:00

2015-08-18 15:14:47

2018-12-05 12:59:28

比特幣區(qū)塊鏈BTC

2017-10-11 17:04:08

2011-03-10 10:36:59

寬帶光纖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品成人av | 宅女噜噜66国产精品观看免费 | 欧美精品一区二区在线观看 | 久久精品综合 | 精品一区二区久久久久久久网站 | 中文字幕日韩欧美 | 涩涩视频大全 | 亚洲精品一区在线观看 | 亚洲欧美精品在线观看 | 亚洲成人av在线播放 | 黄色片在线网站 | 在线观看av网站 | 国产精品夜夜夜一区二区三区尤 | 久久久久久久av麻豆果冻 | 国产在线中文字幕 | 成人在线精品视频 | 91中文字幕在线 | 久久免费资源 | 国产国拍亚洲精品av | 在线看91| 美国av毛片 | 国产日韩欧美中文字幕 | 国产免费让你躁在线视频 | 性色av一区 | 精品1区| 五月婷亚洲 | 日本一区二区三区视频在线 | 91新视频 | 色综合久 | www.国产精 | 精品一区二区av | 欧美色综合一区二区三区 | 久久久久国产精品一区二区 | 日韩精品免费一区二区在线观看 | 午夜视频一区 | 99精品国产一区二区青青牛奶 | 天天看天天操 | 久久小视频 | av网站在线播放 | 午夜精品一区二区三区在线观看 | 97碰碰碰 |