成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java中的動(dòng)態(tài)代理

CoderStudy / 3047人閱讀

摘要:通過這種動(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

相關(guān)文章

  • Java中的動(dòng)態(tài)代理

    摘要:要明白,動(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í)...

    CastlePeaK 評論0 收藏0
  • JAVA代理模式的理解和應(yīng)用

    摘要:代理模式代理模式通俗一點(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í)...

    CatalpaFlat 評論0 收藏0
  • 【干貨】JDK動(dòng)態(tài)代理的實(shí)現(xiàn)原理以及如何手寫一個(gè)JDK動(dòng)態(tài)代理

    摘要:代理模式從類型上來說,可以分為靜態(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)代...

    forsigner 評論0 收藏0
  • Java的三種代理模式

    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é)性...

    Rango 評論0 收藏0
  • 動(dòng)態(tài)代理

    摘要:定義代理設(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)...

    FWHeart 評論0 收藏0
  • 人人都會設(shè)計(jì)模式:代理模式--Proxy

    摘要:話說誰還干類似的事,就在文章末尾點(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...

    tuniutech 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<