摘要:代理即通過(guò)代理類,找到適合你的實(shí)現(xiàn)類。相當(dāng)于現(xiàn)實(shí)生活中的中介的角色,你想租房子,這個(gè)時(shí)候你又不想自己找房子,那你可以找中介,通過(guò)中介找到合適自己的房子,同時(shí)你也可以讓中介幫你簽合同等其他事宜。
代理即通過(guò)代理類,找到適合你的實(shí)現(xiàn)類。相當(dāng)于現(xiàn)實(shí)生活中的中介的角色,你想租房子,這個(gè)時(shí)候你又不想自己找房子,那你可以找中介,通過(guò)中介找到合適自己的房子,同時(shí)你也可以讓中介幫你簽合同等其他事宜。代理存在靜態(tài)代理和動(dòng)態(tài)代理兩種
靜態(tài)代理public interface Sourceable { public void method(); }
public class Source implements Sourceable { @Override public void method() { System.out.println("the original method!"); } }
public class Proxy implements Sourceable { private Source source; public Proxy(){ super(); this.source = new Source(); } @Override public void method() { //新增的處理,個(gè)性化處理 before(); source.method(); atfer(); } private void atfer() { System.out.println("after proxy!"); } private void before() { System.out.println("before proxy!"); } }
測(cè)試類
public class ProxyTest { public static void main(String[] args) { Sourceable source = new Proxy(); source.method(); } }動(dòng)態(tài)代理
JDK動(dòng)態(tài)代理、AOP動(dòng)態(tài)代理
Proxy提供了用于創(chuàng)建動(dòng)態(tài)代理類和代理對(duì)象的靜態(tài)方法,它也是所有動(dòng)態(tài)代理類的父類
創(chuàng)建動(dòng)態(tài)代理類
static Class>getProxyClass(ClassLoader loader,Class>...interfaces):創(chuàng)建一個(gè)動(dòng)態(tài)代理類鎖對(duì)應(yīng)的Class對(duì)象,該代理類將實(shí)現(xiàn)interface所指定的多個(gè)接口,第一個(gè)ClassLoader 參數(shù)指生成動(dòng)態(tài)代理類的類加載器。
創(chuàng)建動(dòng)態(tài)代理對(duì)象
static Object newProxyInstance(ClassLoader loader,Class>...interfaces,InvocationHadnler h):直接創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象,該代理對(duì)象的實(shí)現(xiàn)類實(shí)現(xiàn)了interfaces指定的系列接口,執(zhí)行代理對(duì)象的每個(gè)方法時(shí)都會(huì)被替換執(zhí)行InvocationHadnler對(duì)象的invoke方法
public interface Colorable { public void value(); }
public class RedColor implements Colorable{ @Override public void value() { System.out.println("--------------red-------------"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ColorableProxy implements InvocationHandler { private Colorable colorable; private Colorable proxy; public ColorableProxy(Colorable colorable) { this.colorable = colorable; this.proxy = (Colorable) Proxy.newProxyInstance( Colorable.class.getClassLoader(), new Class>[] { Colorable.class }, this); } public Colorable getProxy() { return proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); System.out.println("===========starting invoke function:" + methodName + "=========="); Object result = method.invoke(colorable, args); System.out.println("=========== invoke function:" + methodName + " success=========="); return result; } public static void main(String[] args) { Colorable proxy = new ColorableProxy(new RedColor()).getProxy(); //真正調(diào)用invoke方法是在這一步才被激發(fā)的,可以debug試一下 proxy.value(); } }
結(jié)果
===========starting invoke function:value========== --------------red------------- =========== invoke function:value success==========
AOP動(dòng)態(tài)代理proxy:代表動(dòng)態(tài)代理對(duì)象
method:代表正在執(zhí)行的方法
args:代表調(diào)用目標(biāo)方法時(shí)傳入的實(shí)參
public interface Colorable { public void value(); }
public class RedColor implements Colorable{ @Override public void value() { System.out.println("--------------red-------------"); } }
public class ToolUtility { public void method(){ System.out.println("運(yùn)行工具方法"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ColorableAOProxy implements InvocationHandler { private Colorable colorable; private Colorable proxy; public ColorableAOProxy(Colorable colorable) { this.colorable = colorable; this.proxy = (Colorable) Proxy.newProxyInstance( Colorable.class.getClassLoader(), new Class>[] { Colorable.class }, this); } public Colorable getProxy() { return proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ToolUtility tool = new ToolUtility(); tool.method(); String methodName = method.getName(); System.out.println("===========starting invoke function:" + methodName + "=========="); Object result = method.invoke(colorable, args); System.out.println("=========== invoke function:" + methodName + " success=========="); return result; } public static void main(String[] args) { Colorable proxy = new ColorableAOProxy(new RedColor()).getProxy(); // 真正調(diào)用invoke方法是在這一步才被激發(fā)的,可以debug試一下 proxy.value(); } }
結(jié)果
運(yùn)行工具方法 ===========starting invoke function:value========== --------------red------------- =========== invoke function:value success==========
更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問(wèn)AppZone網(wǎng)站
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66009.html
摘要:支持重試版本思考小明我手頭還有其他任務(wù),這個(gè)也挺簡(jiǎn)單的。與其他類似的字節(jié)碼編輯器不同,提供了兩個(gè)級(jí)別的源級(jí)和字節(jié)碼級(jí)。另一方面,字節(jié)碼級(jí)允許用戶直接編輯類文件作為其他編輯器。提供與其他字節(jié)碼框架類似的功能,但主要關(guān)注性能。 系列說(shuō)明 java retry 的一步步實(shí)現(xiàn)機(jī)制。 java-retry 源碼地址 情景導(dǎo)入 簡(jiǎn)單的需求 產(chǎn)品經(jīng)理:實(shí)現(xiàn)一個(gè)按條件,查詢用戶信息的服務(wù)。 小明:好的...
摘要:當(dāng)活動(dòng)線程核心線程非核心線程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請(qǐng)求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實(shí)現(xiàn)在軟件開(kāi)發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點(diǎn)如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計(jì)模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過(guò)的點(diǎn)點(diǎn)滴滴,依然清楚的記得當(dāng)初愛(ài)情萌芽的模樣…… Java 進(jìn)階面試問(wèn)題列表 -...
摘要:了解的相關(guān)術(shù)語(yǔ)通知通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。就是用來(lái)配置切面設(shè)置代理模式。 了解AOP的相關(guān)術(shù)語(yǔ) 1.通知(Advice): 通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。 2.連接點(diǎn)(Joinpoint): 程序能夠應(yīng)用通知的一個(gè)時(shí)機(jī),這些時(shí)機(jī)就是連接點(diǎn),例如方法被調(diào)用時(shí)、異常被拋出時(shí)等等。 ...
閱讀 3268·2021-11-23 10:09
閱讀 2068·2021-10-26 09:51
閱讀 982·2021-10-09 09:44
閱讀 3912·2021-10-08 10:04
閱讀 2751·2021-09-22 15:14
閱讀 3631·2021-09-22 15:02
閱讀 1067·2021-08-24 10:03
閱讀 1732·2019-12-27 12:14