解讀jdk動(dòng)態(tài)代理為什么必須實(shí)現(xiàn)接口
使用jdk生成代理類(lèi)
通過(guò)jdk實(shí)現(xiàn)的動(dòng)態(tài)代理會(huì)使用Proxy的newProxyInstance方法:
寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)InvocationHandler,內(nèi)部要注入對(duì)應(yīng)原代理類(lèi)的實(shí)現(xiàn):
測(cè)試代碼:
TestServiceImpl testService = new TestServiceImpl(); TestServiceImplHandler testServiceImplHandler = new TestServiceImplHandler(testService); TestService testServiceProxy = (TestService)Proxy.newProxyInstance(testService.getClass().getClassLoader(), testService.getClass().getInterfaces(), testServiceImplHandler); testServiceProxy.test();
看到生成的代理類(lèi)父類(lèi)是Proxy類(lèi),通過(guò)jdk代理生成的類(lèi)都繼承Proxy類(lèi):
因?yàn)镴ava是單繼承的,而代理類(lèi)又必須繼承自Proxy類(lèi),所以通過(guò)jdk代理的類(lèi)必須實(shí)現(xiàn)接口。
生成代理的字節(jié)碼
還可以通過(guò)生成代理類(lèi)的字節(jié)碼查看,
package java.lang.reflect;包的Proxy類(lèi)
通過(guò)將生成一半的代理類(lèi)寫(xiě)到文件里面去:
生成的文件:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java的中l(wèi)ombok下的@Builder注解用法詳解
這篇文章主要介紹了Java的中l(wèi)ombok下的@Builder注解用法詳解,lombok注解在java進(jìn)行編譯時(shí)進(jìn)行代碼的構(gòu)建,對(duì)于java對(duì)象的創(chuàng)建工作它可以更優(yōu)雅,不需要寫(xiě)多余的重復(fù)的代碼,在出現(xiàn)lombok之后,對(duì)象的創(chuàng)建工作更提供Builder方法,需要的朋友可以參考下2023-11-11解決Mybatis映射文件mapper.xml中的注釋問(wèn)題
這篇文章主要介紹了解決Mybatis映射文件mapper.xml中的注釋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05java 線(xiàn)程之對(duì)象的同步和異步(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇java 線(xiàn)程之對(duì)象的同步和異步(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07關(guān)于為何說(shuō)JAVA中要慎重使用繼承詳解
Java繼承是面向?qū)ο蟮淖铒@著的一個(gè)特征,然而下面這篇文章主要給大家介紹了關(guān)于為何說(shuō)JAVA中要慎重使用繼承的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Gradle構(gòu)建基本的Web項(xiàng)目結(jié)構(gòu)
這篇文章主要為大家介紹了Gradle創(chuàng)建Web項(xiàng)目基本的框架結(jié)構(gòu)搭建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03