Java JDK 動態(tài)代理的使用方法示例
本文主要和大家分享介紹了關(guān)于Java JDK 動態(tài)代理使用的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面來一起看看詳細(xì)的介紹:
前言
代理是一種常用的設(shè)計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負(fù)責(zé)為委托類預(yù)處理消息,過濾消息并轉(zhuǎn)發(fā)消息,以及進行消息被委托類執(zhí)行后的后續(xù)處理。
Spring AOP的實現(xiàn)對于接口來說就是使用的JDK的動態(tài)代理來實現(xiàn)的,而對于類的代理使用CGLIB來實現(xiàn)。
JDK的動態(tài)代理,就是在程序運行的過程中,根據(jù)被代理的接口來動態(tài)生成代理類的class文件,并加載運行的過程。
使用
首先創(chuàng)建接口
public interface Subject { void test(); }
創(chuàng)建實現(xiàn)類
public class SubjectImpl implements Subject { @Override public void test() { System.out.println("This is test method"); } }
創(chuàng)建InvocationHandler實現(xiàn)類
public class SubjectInvocationHandler implements InvocationHandler { private Subject target; public SubjectInvocationHandler(Subject subject) { this.target = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before method!"); Object result = method.invoke(target, args); System.out.println("after method!"); return result; } }
最后調(diào)用:
public class DynamicProxy { public static void main(String args[]) { Subject subject = new SubjectImpl(); Subject proxy = (Subject) Proxy.newProxyInstance(SubjectImpl.class.getClassLoader(), SubjectImpl.class.getInterfaces(), new SubjectInvocationHandler(subject)); proxy.test(); System.out.println(proxy); } }
運行結(jié)果:
before method! This is test method after method!
總結(jié)
1.通過實現(xiàn)InvocationHandler接口,在invoke方法中實現(xiàn)代理邏輯;
2.通過Proxy的newProxyInstance方法生成代理類,這里主要是根據(jù)被代理類的接口類型,通過反射創(chuàng)建代理類;
關(guān)于分析JDK動態(tài)代理這里有一篇很好的文章:Java JDK動態(tài)代理(AOP)的實現(xiàn)原理與使用詳析
好了,以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
spring boot 測試單元修改數(shù)據(jù)庫不成功的解決
這篇文章主要介紹了spring boot 測試單元修改數(shù)據(jù)庫不成功的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09面試時必問的JVM運行時數(shù)據(jù)區(qū)詳解
這篇文章主要介紹了JVM運行時數(shù)據(jù)區(qū)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-08-08Feign調(diào)用服務(wù)時丟失Cookie和Header信息的解決方案
這篇文章主要介紹了Feign調(diào)用服務(wù)時丟失Cookie和Header信息的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03