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