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

資訊專欄INFORMATION COLUMN

Java代理設(shè)計(jì)模式詳解

CoorChice / 528人閱讀

摘要:代理即通過(guò)代理類,找到適合你的實(shí)現(xiàn)類。相當(dāng)于現(xiàn)實(shí)生活中的中介的角色,你想租房子,這個(gè)時(shí)候你又不想自己找房子,那你可以找中介,通過(guò)中介找到合適自己的房子,同時(shí)你也可以讓中介幫你簽合同等其他事宜。

代理即通過(guò)代理類,找到適合你的實(shí)現(xiàn)類。相當(dāng)于現(xiàn)實(shí)生活中的中介的角色,你想租房子,這個(gè)時(shí)候你又不想自己找房子,那你可以找中介,通過(guò)中介找到合適自己的房子,同時(shí)你也可以讓中介幫你簽合同等其他事宜。代理存在靜態(tài)代理和動(dòng)態(tài)代理兩種

靜態(tài)代理
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() {  
      //新增的處理,個(gè)性化處理
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}  

測(cè)試類

public class ProxyTest {  
  
    public static void main(String[] args) {  
        Sourceable source = new Proxy();  
        source.method();  
    }  
  
}  
動(dòng)態(tài)代理

JDK動(dòng)態(tài)代理、AOP動(dòng)態(tài)代理

Proxy提供了用于創(chuàng)建動(dòng)態(tài)代理類和代理對(duì)象的靜態(tài)方法,它也是所有動(dòng)態(tài)代理類的父類

創(chuàng)建動(dòng)態(tài)代理類

static ClassgetProxyClass(ClassLoader loader,Class...interfaces):創(chuàng)建一個(gè)動(dòng)態(tài)代理類鎖對(duì)應(yīng)的Class對(duì)象,該代理類將實(shí)現(xiàn)interface所指定的多個(gè)接口,第一個(gè)ClassLoader 參數(shù)指生成動(dòng)態(tài)代理類的類加載器。

創(chuàng)建動(dòng)態(tài)代理對(duì)象

static Object newProxyInstance(ClassLoader loader,Class...interfaces,InvocationHadnler h):直接創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象,該代理對(duì)象的實(shí)現(xiàn)類實(shí)現(xiàn)了interfaces指定的系列接口,執(zhí)行代理對(duì)象的每個(gè)方法時(shí)都會(huì)被替換執(zhí)行InvocationHadnler對(duì)象的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();
        //真正調(diào)用invoke方法是在這一步才被激發(fā)的,可以debug試一下
        proxy.value();
    }

}

結(jié)果

===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

proxy:代表動(dòng)態(tài)代理對(duì)象

method:代表正在執(zhí)行的方法

args:代表調(diào)用目標(biāo)方法時(shí)傳入的實(shí)參

AOP動(dòng)態(tài)代理

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("運(yùn)行工具方法");
    }
}
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();
        // 真正調(diào)用invoke方法是在這一步才被激發(fā)的,可以debug試一下
        proxy.value();
    }
}

結(jié)果

運(yùn)行工具方法
===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問(wèn)AppZone網(wǎng)站

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

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

相關(guān)文章

  • java retry(重試) spring retry, guava retrying 詳解

    摘要:支持重試版本思考小明我手頭還有其他任務(wù),這個(gè)也挺簡(jiǎn)單的。與其他類似的字節(jié)碼編輯器不同,提供了兩個(gè)級(jí)別的源級(jí)和字節(jié)碼級(jí)。另一方面,字節(jié)碼級(jí)允許用戶直接編輯類文件作為其他編輯器。提供與其他字節(jié)碼框架類似的功能,但主要關(guān)注性能。 系列說(shuō)明 java retry 的一步步實(shí)現(xiàn)機(jī)制。 java-retry 源碼地址 情景導(dǎo)入 簡(jiǎn)單的需求 產(chǎn)品經(jīng)理:實(shí)現(xiàn)一個(gè)按條件,查詢用戶信息的服務(wù)。 小明:好的...

    LucasTwilight 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線程核心線程非核心線程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請(qǐng)求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0
  • Java深入-框架技巧

    摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實(shí)現(xiàn)在軟件開(kāi)發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點(diǎn)如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計(jì)模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過(guò)的點(diǎn)點(diǎn)滴滴,依然清楚的記得當(dāng)初愛(ài)情萌芽的模樣…… Java 進(jìn)階面試問(wèn)題列表 -...

    chengtao1633 評(píng)論0 收藏0
  • SpringAOP面向切面詳解(帶實(shí)例)

    摘要:了解的相關(guān)術(shù)語(yǔ)通知通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。就是用來(lái)配置切面設(shè)置代理模式。 了解AOP的相關(guān)術(shù)語(yǔ) 1.通知(Advice): 通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。 2.連接點(diǎn)(Joinpoint): 程序能夠應(yīng)用通知的一個(gè)時(shí)機(jī),這些時(shí)機(jī)就是連接點(diǎn),例如方法被調(diào)用時(shí)、異常被拋出時(shí)等等。 ...

    馬忠志 評(píng)論0 收藏0

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

0條評(píng)論

閱讀需要支付1元查看
<