亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

java靜態(tài)代理/動(dòng)態(tài)代理

ivyzhang / 1117人閱讀

摘要:什么是代理大道理上講代理是一種軟件設(shè)計(jì)模式,目的地希望能做到代碼重用。這個(gè)就好比商戶明星經(jīng)紀(jì)人代理明星這種模式。

(1)什么是代理?

大道理上講代理是一種軟件設(shè)計(jì)模式,目的地希望能做到代碼重用。具體上講,代理這種設(shè)計(jì)模式是通過(guò)不直接訪問(wèn)被代理對(duì)象的方式,而訪問(wèn)被代理對(duì)象的方法。這個(gè)就好比 商戶---->明星經(jīng)紀(jì)人(代理)---->明星這種模式。我們可以不通過(guò)直接與明星對(duì)話的情況下,而通過(guò)明星經(jīng)紀(jì)人(代理)與其產(chǎn)生間接對(duì)話

(2)什么情況下使用代理?

a. 設(shè)計(jì)模式中有一個(gè)設(shè)計(jì)原則是開閉原則,是說(shuō)對(duì)修改關(guān)閉對(duì)擴(kuò)展開放,我們?cè)诠ぷ髦杏袝r(shí)會(huì)接手很多前人的代碼,里面代碼邏輯讓人摸不著頭腦(sometimes the code is really like shit),這時(shí)就很難去下手修改代碼,那么這時(shí)我們就可以通過(guò)代理對(duì)類進(jìn)行增強(qiáng)。
b. 我們?cè)谑褂肦PC框架的時(shí)候,框架本身并不能提前知道各個(gè)業(yè)務(wù)方要調(diào)用哪些接口的哪些方法 。那么這個(gè)時(shí)候,就可用通過(guò)動(dòng)態(tài)代理的方式來(lái)建立一個(gè)中間人給客戶端使用,也方便框架進(jìn)行搭建邏輯,某種程度上也是客戶端代碼和框架松耦合的一種表現(xiàn)。

(3)靜態(tài)代理和動(dòng)態(tài)代理
靜態(tài)代理比較簡(jiǎn)單,主要是多態(tài)實(shí)現(xiàn),這里主要記錄下動(dòng)態(tài)代理

定義代理父類

package cn.crawler.split.test.proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public interface Father {
    public void rent();

    public void hello(String str);
}

子類

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class Son implements Father {
    @Override
    public void rent()
    {
        System.out.println("I want to rent my house");
    }

    @Override
    public void hello(String str)
    {
        System.out.println("hello: " + str);
    }
}

代理類

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class DynamicProxy implements InvocationHandler
{
    // 這個(gè)就是我們要代理的真實(shí)對(duì)象
    private Object subject;

    //    構(gòu)造方法,給我們要代理的真實(shí)對(duì)象賦初值
    public DynamicProxy(Object subject)
    {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args)
            throws Throwable
    {
        //  在代理真實(shí)對(duì)象前我們可以添加一些自己的操作
        System.out.println("before rent house");

        System.out.println("Method:" + method);

        //    當(dāng)代理對(duì)象調(diào)用真實(shí)對(duì)象的方法時(shí),其會(huì)自動(dòng)的跳轉(zhuǎn)到代理對(duì)象關(guān)聯(lián)的handler對(duì)象的invoke方法來(lái)進(jìn)行調(diào)用
        method.invoke(subject, args);

        //  在代理真實(shí)對(duì)象后我們也可以添加一些自己的操作
        System.out.println("after rent house");

        return null;
    }

}

測(cè)試類

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class MyProxyTest {
    public static void main (String[] stra){

        //代理對(duì)象
        Father son = new Son();
        System.out.println(son.getClass());

        InvocationHandler handler  = new DynamicProxy(son);

        Father father = (Father)Proxy.newProxyInstance(handler.getClass().getClassLoader(), son.getClass().getInterfaces(), handler);
        System.out.println(father.getClass().getName());
        father.rent();
        father.hello("world");


    }
}

測(cè)試結(jié)果:

class cn.crawler.split.test.proxy.Son
org.springframework.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$f4f3d897
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.rent()
I want to rent my house
after rent house
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.hello(java.lang.String)
hello: world
after rent house

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71562.html

相關(guān)文章

  • Java三種代理模式:靜態(tài)代理動(dòng)態(tài)代理和cglib代理

    摘要:動(dòng)態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時(shí)產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無(wú)需實(shí)現(xiàn)接口,通過(guò)生成類字節(jié)碼實(shí)現(xiàn)代理,比反射稍快,不存在性能問(wèn)題,但會(huì)繼承目標(biāo)對(duì)象,需要重寫方法,所以目標(biāo)對(duì)象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象額外的訪問(wèn)方式,即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象,這樣可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功...

    Kaede 評(píng)論0 收藏0
  • Java代理設(shè)計(jì)模式(Proxy)的四種具體實(shí)現(xiàn):靜態(tài)代理動(dòng)態(tài)代理

    摘要:除了和外,我們還有最后一招我直接把一個(gè)代理類的源代碼用字符串拼出來(lái),然后基于這個(gè)字符串調(diào)用的編譯期,動(dòng)態(tài)的創(chuàng)建一個(gè)新的文件,然后動(dòng)態(tài)編譯這個(gè)文件,這樣也能得到一個(gè)新的代理類。 面試問(wèn)題:Java里的代理設(shè)計(jì)模式(Proxy Design Pattern)一共有幾種實(shí)現(xiàn)方式?這個(gè)題目很像孔乙己?jiǎn)栜钕愣沟能钭钟心膸追N寫法? showImg(https://segmentfault.com/...

    gclove 評(píng)論0 收藏0
  • Java 動(dòng)態(tài)代理(Dynamic proxy) 小結(jié)

    摘要:代理模式基本概念不論是靜態(tài)代理還是動(dòng)態(tài)代理其本質(zhì)都是代理模式的一種實(shí)現(xiàn)那么什么是代理模式呢代理模式即給某一個(gè)對(duì)象提供一個(gè)代理并由代理對(duì)象控制對(duì)原對(duì)象的引用代理模式其實(shí)取材于實(shí)際生活例如我們生活中常見的房屋租賃代理我們?cè)谧夥繒r(shí)一般不是直接和房 代理模式 基本概念 不論是靜態(tài)代理還是動(dòng)態(tài)代理, 其本質(zhì)都是代理模式的一種實(shí)現(xiàn), 那么什么是代理模式呢?代理模式, 即給某一個(gè)對(duì)象提供一個(gè)代理, ...

    Jason 評(píng)論0 收藏0
  • java動(dòng)態(tài)代理及原理

    摘要:動(dòng)態(tài)代理的產(chǎn)生就是這樣而來(lái)的。在的方案中我們只需要這樣做可以實(shí)現(xiàn)動(dòng)態(tài)代理了。委托類實(shí)際執(zhí)行類利用提供的實(shí)現(xiàn)動(dòng)態(tài)代理代理環(huán)繞執(zhí)行實(shí)際的方法利用的實(shí)現(xiàn)代理動(dòng)態(tài)代理,有幾個(gè)關(guān)鍵點(diǎn),一個(gè)就是接口,這個(gè)方法中的方法是執(zhí)行代理時(shí)會(huì)執(zhí)行的方法。 什么是代理? 代理是一種設(shè)計(jì)模式,簡(jiǎn)單的說(shuō)就是為某個(gè)對(duì)象提供代理,以控制這個(gè)對(duì)象的訪問(wèn),在不修改原方法的情況下做方法增強(qiáng),簡(jiǎn)單的可以分為兩種: 靜態(tài)代理 ...

    Forelax 評(píng)論0 收藏0
  • Java中的動(dòng)態(tài)代理

    摘要:要明白,動(dòng)態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無(wú)法繼承或重寫。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類對(duì)象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對(duì)于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類,真實(shí)類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實(shí)類的對(duì)象實(shí)例,在重寫業(yè)務(wù)方法中通過(guò)調(diào)用真實(shí)...

    CastlePeaK 評(píng)論0 收藏0
  • Java的三種代理模式

    Java的三種代理模式 參考:http://www.cnblogs.com/cenyu/...Java核心技術(shù)原書第九版6.5節(jié) 為什么使用代理   我們?cè)趯懸粋€(gè)功能函數(shù)時(shí),經(jīng)常需要在其中寫入與功能不是直接相關(guān)但很有必要的代 碼,如日志記錄,信息發(fā)送,安全和事務(wù)支持等,這些枝節(jié)性代碼雖然是必要的,但它會(huì)帶來(lái)以下麻煩: 枝節(jié)性代碼游離在功能性代碼之外,它不是函數(shù)的目的,這是對(duì)OO是一種破壞 枝節(jié)性...

    Rango 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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