摘要:通過這種動態代理,可以實現在調用某些方法前實現我們想要的操作。
創建接口
// 創建一個接口,名字叫Resource public interface Resource { public void operationA(); public void operationB(); }實現接口
// Resource接口的實現 public class ConcreateResource implements Resource{ public ConcreateResource() { System.out.println("創建了一個ConcreateResource的對象"); } @Override public void operationA() { System.out.println("Operaation A"); } @Override public void operationB() { System.out.println("Operation B"); } }實現代理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Resource resource; public DynamicProxy() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在方法調用時創建對象 if(resource==null){ resource = new ConcreateResource(); System.out.println("初始化"); } if (method.getName().equals("operationA")) { System.out.println("OperationA in Proxy"); } return method.invoke(resource, args);//執行方法; } //創建一個綁定了該代理對象的虛擬的Resource,此時并未創建實際的對象 public Resource create() { Resource resource = null; resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[] { Resource.class }, this);//綁定 return resource; } }測試
package test0107; import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) { //第一種測試,使用Create方法創建resource對象,在調用時創建該對象的實例 DynamicProxy dynamicProxy = new DynamicProxy(); Resource resource = dynamicProxy.create();//綁定,此時對象沒有創建 System.out.println("此時對象未創建"); resource.operationA(); resource.operationB(); Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在測試類中綁定 resource2.operationA(); resource2.operationB(); } } /* 結果如下: 此時對象未創建 創建了一個ConcreateResource的對象 初始化 OperationA in Proxy Operaation A Operation B OperationA in Proxy Operaation A Operation B */分析:
先輸出“此時對象未創建”說明在使用代理綁定Resource對象的時候并沒有創建該對象的實例,只是返回了一個可以調用的接口
輸出“創建了一個ConcreateResource的對象”和“初始化”說明在調用方法的時候創建了該對象的實例
接下來的輸出即說明綁定了代理的對象在每一次調用方法的時候都是在執行綁定的代理實例的invoke方法,如此,代理模式就完成了。
通過這種動態代理,可以實現在調用某些方法前實現我們想要的操作。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65385.html
摘要:要明白,動態代理類的存在意義是為了攔截方法并修改邏輯而動態代理的局限性之一就是只能攔截接口所聲明的方法。因為動態代理類是繼承自業務類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態代理類對象。 動態代理 1、先談靜態代理 對于靜態代理,我們已經很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業務方法,代理類持有真實類的對象實例,在重寫業務方法中通過調用真實...
摘要:代理模式代理模式通俗一點的解釋就是在操作一個對象和對象中的方法時,不是直接操作這個對象,還是通過一個代理對象來操作這個實際的目標對象。 代理模式: 代理模式通俗一點的解釋就是在操作一個對象和對象中的方法時,不是直接操作這個對象,還是通過一個代理對象來操作這個實際的目標對象。應用場景一般是需要在執行某個已經寫好的方法前后再添加一段邏輯,比如執行方法前打印日志,或者在執行方法之前和之后打時...
摘要:代理模式從類型上來說,可以分為靜態代理和動態代理兩種類型。然而今天的重點是我們都知道牛逼轟轟的的實現的一種方式是使用的動態代理另一種是,大部分人也會用的動態代理,不過沒有研究過的動態代理到底是怎么實現的。 動態代理 代理模式是設計模式中非常重要的一種類型,而設計模式又是編程中非常重要的知識點,特別是在業務系統的重構中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態代理和動態代...
Java的三種代理模式 參考:http://www.cnblogs.com/cenyu/...Java核心技術原書第九版6.5節 為什么使用代理 我們在寫一個功能函數時,經常需要在其中寫入與功能不是直接相關但很有必要的代 碼,如日志記錄,信息發送,安全和事務支持等,這些枝節性代碼雖然是必要的,但它會帶來以下麻煩: 枝節性代碼游離在功能性代碼之外,它不是函數的目的,這是對OO是一種破壞 枝節性...
摘要:話說誰還干類似的事,就在文章末尾點個贊代銷店等其實就是現在的商店,以前小的時候聽家鄉人叫代銷店,也是一種代理模式。可以說是系統中最重要的架構之一。 showImg(https://segmentfault.com/img/remote/1460000012278678?w=1240&h=469); PS:轉載請注明出處作者: TigerChain地址: http://www.jians...
閱讀 1264·2021-10-18 13:32
閱讀 2333·2021-09-24 09:47
閱讀 1323·2021-09-23 11:22
閱讀 2463·2019-08-30 14:06
閱讀 571·2019-08-30 12:48
閱讀 1997·2019-08-30 11:03
閱讀 535·2019-08-29 17:09
閱讀 2462·2019-08-29 14:10