摘要:通過這種動(dòng)態(tài)代理,可以實(shí)現(xiàn)在調(diào)用某些方法前實(shí)現(xiàn)我們想要的操作。
創(chuàng)建接口
// 創(chuàng)建一個(gè)接口,名字叫Resource public interface Resource { public void operationA(); public void operationB(); }實(shí)現(xiàn)接口
// Resource接口的實(shí)現(xiàn) public class ConcreateResource implements Resource{ public ConcreateResource() { System.out.println("創(chuàng)建了一個(gè)ConcreateResource的對象"); } @Override public void operationA() { System.out.println("Operaation A"); } @Override public void operationB() { System.out.println("Operation B"); } }實(shí)現(xiàn)代理
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 { //在方法調(diào)用時(shí)創(chuàng)建對象 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);//執(zhí)行方法; } //創(chuàng)建一個(gè)綁定了該代理對象的虛擬的Resource,此時(shí)并未創(chuàng)建實(shí)際的對象 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方法創(chuàng)建resource對象,在調(diào)用時(shí)創(chuàng)建該對象的實(shí)例 DynamicProxy dynamicProxy = new DynamicProxy(); Resource resource = dynamicProxy.create();//綁定,此時(shí)對象沒有創(chuàng)建 System.out.println("此時(shí)對象未創(chuàng)建"); resource.operationA(); resource.operationB(); Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在測試類中綁定 resource2.operationA(); resource2.operationB(); } } /* 結(jié)果如下: 此時(shí)對象未創(chuàng)建 創(chuàng)建了一個(gè)ConcreateResource的對象 初始化 OperationA in Proxy Operaation A Operation B OperationA in Proxy Operaation A Operation B */分析:
先輸出“此時(shí)對象未創(chuàng)建”說明在使用代理綁定Resource對象的時(shí)候并沒有創(chuàng)建該對象的實(shí)例,只是返回了一個(gè)可以調(diào)用的接口
輸出“創(chuàng)建了一個(gè)ConcreateResource的對象”和“初始化”說明在調(diào)用方法的時(shí)候創(chuàng)建了該對象的實(shí)例
接下來的輸出即說明綁定了代理的對象在每一次調(diào)用方法的時(shí)候都是在執(zhí)行綁定的代理實(shí)例的invoke方法,如此,代理模式就完成了。
通過這種動(dòng)態(tài)代理,可以實(shí)現(xiàn)在調(diào)用某些方法前實(shí)現(xiàn)我們想要的操作。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65385.html
摘要:要明白,動(dòng)態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類對象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類,真實(shí)類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實(shí)類的對象實(shí)例,在重寫業(yè)務(wù)方法中通過調(diào)用真實(shí)...
摘要:代理模式代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對象和對象中的方法時(shí),不是直接操作這個(gè)對象,還是通過一個(gè)代理對象來操作這個(gè)實(shí)際的目標(biāo)對象。 代理模式: 代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對象和對象中的方法時(shí),不是直接操作這個(gè)對象,還是通過一個(gè)代理對象來操作這個(gè)實(shí)際的目標(biāo)對象。應(yīng)用場景一般是需要在執(zhí)行某個(gè)已經(jīng)寫好的方法前后再添加一段邏輯,比如執(zhí)行方法前打印日志,或者在執(zhí)行方法之前和之后打時(shí)...
摘要:代理模式從類型上來說,可以分為靜態(tài)代理和動(dòng)態(tài)代理兩種類型。然而今天的重點(diǎn)是我們都知道牛逼轟轟的的實(shí)現(xiàn)的一種方式是使用的動(dòng)態(tài)代理另一種是,大部分人也會用的動(dòng)態(tài)代理,不過沒有研究過的動(dòng)態(tài)代理到底是怎么實(shí)現(xiàn)的。 動(dòng)態(tài)代理 代理模式是設(shè)計(jì)模式中非常重要的一種類型,而設(shè)計(jì)模式又是編程中非常重要的知識點(diǎn),特別是在業(yè)務(wù)系統(tǒng)的重構(gòu)中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態(tài)代理和動(dòng)態(tài)代...
Java的三種代理模式 參考:http://www.cnblogs.com/cenyu/...Java核心技術(shù)原書第九版6.5節(jié) 為什么使用代理 我們在寫一個(gè)功能函數(shù)時(shí),經(jīng)常需要在其中寫入與功能不是直接相關(guān)但很有必要的代 碼,如日志記錄,信息發(fā)送,安全和事務(wù)支持等,這些枝節(jié)性代碼雖然是必要的,但它會帶來以下麻煩: 枝節(jié)性代碼游離在功能性代碼之外,它不是函數(shù)的目的,這是對OO是一種破壞 枝節(jié)性...
摘要:定義代理設(shè)計(jì)模式為其他對象提供一種代理以控制對這個(gè)對象的訪問。動(dòng)態(tài)代理代理類在程序運(yùn)行時(shí)創(chuàng)建的代理方式被成為動(dòng)態(tài)代理。 1.定義 代理設(shè)計(jì)模式:為其他對象提供一種代理以控制對這個(gè)對象的訪問。動(dòng)態(tài)代理:代理類在程序運(yùn)行時(shí)創(chuàng)建的代理方式被成為 動(dòng)態(tài)代理。代理類并不是在Java代碼中定義的,而而是在運(yùn)行時(shí)根據(jù)我們在Java代碼中的指示動(dòng)態(tài)生成的 2.簡介 Sping mvc的Aop就是基于動(dòng)...
摘要:話說誰還干類似的事,就在文章末尾點(diǎn)個(gè)贊代銷店等其實(shí)就是現(xiàn)在的商店,以前小的時(shí)候聽家鄉(xiāng)人叫代銷店,也是一種代理模式??梢哉f是系統(tǒng)中最重要的架構(gòu)之一。 showImg(https://segmentfault.com/img/remote/1460000012278678?w=1240&h=469); PS:轉(zhuǎn)載請注明出處作者: TigerChain地址: http://www.jians...
閱讀 1278·2021-10-18 13:32
閱讀 2360·2021-09-24 09:47
閱讀 1339·2021-09-23 11:22
閱讀 2476·2019-08-30 14:06
閱讀 582·2019-08-30 12:48
閱讀 2012·2019-08-30 11:03
閱讀 548·2019-08-29 17:09
閱讀 2477·2019-08-29 14:10