Java 動(dòng)態(tài)代理原理分析
Java 動(dòng)態(tài)代理原理分析
概要
AOP的攔截功能是由java中的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)的。說(shuō)白了,就是在目標(biāo)類的基礎(chǔ)上增加切面邏輯,生成增強(qiáng)的目標(biāo)類(該切面邏輯或者在目標(biāo)類函數(shù)執(zhí)行之前,或者目標(biāo)類函數(shù)執(zhí)行之后,或者在目標(biāo)類函數(shù)拋出異常時(shí)候執(zhí)行。Spring中的動(dòng)態(tài)代理是使用Cglib進(jìn)行實(shí)現(xiàn)的。我們這里分析的是JDK中的動(dòng)態(tài)代理實(shí)現(xiàn)機(jī)制。
下面我們通過(guò)例子快速了解JDK中的動(dòng)態(tài)代理實(shí)現(xiàn)方式。
示例
需要代理的接口
public interface IHello { public void sayHello(); }
需要代理的類
public class HelloImpl implements IHello { public void sayHello() { System.out.println(“Hello World…”); } }
調(diào)用處理器實(shí)現(xiàn)類
public class ProxyHandler implements InvocationHandler { private Object target; public ProxyHandler(Object target) { this.target = target; } public Object proxyInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“aspect before … “); Object result = method.invoke(this.target, args); System.out.println(“aspect after … “); return result; } }
測(cè)試類入口
public class Main { public static void main(String[] args) { ProxyHandler proxy = new ProxyHandler(new HelloImpl()); IHello hello = (IHello) proxy.proxyInstance(); hello.sayHello(); } }
Proxy 源碼解析
newProxyInstance() 方法
省略了不關(guān)心的代碼
public static Object newProxyInstance(ClassLoader loader, Class c){ }
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 一文了解Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn)
- Java實(shí)現(xiàn)JDK動(dòng)態(tài)代理的原理詳解
- Java cglib動(dòng)態(tài)代理原理分析
- Java JDK動(dòng)態(tài)代理實(shí)現(xiàn)原理實(shí)例解析
- Java動(dòng)態(tài)代理語(yǔ)法Proxy類原理詳解
- Java JDK動(dòng)態(tài)代理(AOP)的實(shí)現(xiàn)原理與使用詳析
- JAVA動(dòng)態(tài)代理模式(從現(xiàn)實(shí)生活角度理解代碼原理)
- Java JDK動(dòng)態(tài)代理的基本原理詳細(xì)介紹
- Java動(dòng)態(tài)代理簡(jiǎn)單介紹
相關(guān)文章
SpringBoot JPA出現(xiàn)錯(cuò)誤:No identifier specified&nb
這篇文章主要介紹了SpringBoot JPA出現(xiàn)錯(cuò)誤:No identifier specified for en解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03springboot?vue接口測(cè)試定義編輯功能的實(shí)現(xiàn)
這篇文章主要為大家介紹了springboot?vue接口測(cè)試定義編輯功能的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot過(guò)濾器實(shí)現(xiàn)項(xiàng)目?jī)?nèi)接口過(guò)濾詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何利用過(guò)濾器實(shí)現(xiàn)項(xiàng)目?jī)?nèi)接口過(guò)濾,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04SpringBoot的java -jar命令啟動(dòng)原理解讀
這篇文章主要介紹了SpringBoot的java -jar命令啟動(dòng)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02HashMap vs TreeMap vs Hashtable vs LinkedHashMap
這篇文章主要介紹了HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07解決"XML Parser Error on line 1: 前言中不允許有內(nèi)容"錯(cuò)誤
解決用windows自帶的記事編輯xml文件后出現(xiàn) "XML Parser Error on line 1: 前言中不允許有內(nèi)容。"的錯(cuò)誤2018-02-02Spring定時(shí)任務(wù)實(shí)現(xiàn)與配置(二)
這篇文章主要為大家詳細(xì)介紹了Spring定時(shí)任務(wù)的實(shí)現(xiàn)與配置第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘
這篇文章主要介紹了java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08