Java代理模式之JDK動(dòng)態(tài)代理

了解什么是動(dòng)態(tài)代理模式,可參考Java設(shè)計(jì)模式之代理模式

簡(jiǎn)介

  • JDK動(dòng)態(tài)代理是java.lang.reflect.*包所提供的方式,它所代理的真實(shí)對(duì)象必須實(shí)現(xiàn)一個(gè)接口,依據(jù)該接口才能生成真實(shí)對(duì)象的代理。
  • 在JDK動(dòng)態(tài)代理中,想要實(shí)現(xiàn)代理邏輯類,必須實(shí)現(xiàn)java.lang.reflect.InvocationHandler接口,它里面定義了一個(gè)invoke方法來(lái)實(shí)現(xiàn)具體的代理邏輯。
  • 下面示例的具體代碼可到jdk動(dòng)態(tài)代理中下載。

示例

【真實(shí)對(duì)象類及其接口】

//接口
public interface HelloWorld {
    void sayHelloWorld();
}
//實(shí)現(xiàn)對(duì)象
public class HelloWorldImpl implements HelloWorld {
    @Override
    public void sayHelloWorld() {
        System.out.println("hello world!");
    }
}

【動(dòng)態(tài)代理綁定和代理邏輯實(shí)現(xiàn)】

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyExample implements InvocationHandler {

    //真實(shí)對(duì)象
    private Object target = null;

    /**
     * 建立代理對(duì)象和真實(shí)對(duì)象的代理關(guān)系,并且返回代理對(duì)象
     * @param target 真實(shí)對(duì)象
     * @return 代理對(duì)象
     */
    public Object bind(Object target){
        this.target = target;
        /*
        * newProxyInstance參數(shù)
        * 1、類加載器
        * 2、將生成的代理對(duì)象掛到哪些接口下
        * 3、實(shí)現(xiàn)了代理邏輯的代理類(實(shí)現(xiàn)InvocationHandler接口)
        * */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    /**
     * @param proxy 代理對(duì)象
     * @param method 當(dāng)前調(diào)度方法
     * @param args 當(dāng)前方法參數(shù)
     * @return 代理結(jié)果返回
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("進(jìn)入代理邏輯方法");
        System.out.println("在調(diào)度真實(shí)對(duì)象之前的服務(wù)");

        Object obj = method.invoke(target, args);

        System.out.println("在調(diào)度真實(shí)對(duì)象之后的服務(wù)");

        return obj;
    }
}

【測(cè)試】

public class TestJdkProxy {

    public static void main(String[] args) {
        JdkProxyExample jdk = new JdkProxyExample();
        //綁定關(guān)系
        HelloWorld proxy = (HelloWorld) jdk.bind(new HelloWorldImpl());
        proxy.sayHelloWorld();
    }
}

【測(cè)試結(jié)果】


測(cè)試結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,923評(píng)論 2 8
  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陳阿飛閱讀 882評(píng)論 1 1
  • 自動(dòng)推導(dǎo):var與let類型是根據(jù)右側(cè)的代碼,自動(dòng)推導(dǎo)對(duì)應(yīng)類型。在開(kāi)發(fā)中極少使用直接指定類型,通常是自動(dòng)推導(dǎo) 由于...
    Gary_fei閱讀 136評(píng)論 0 0
  • 突然發(fā)現(xiàn)自己已經(jīng)好久沒(méi)有靜下心來(lái)看書了。 想起初中和高中的時(shí)候,那個(gè)時(shí)候電腦和手機(jī)還不是太普及,也不像現(xiàn)在這樣滿大...
    山頂?shù)暮诠沸?/span>閱讀 141評(píng)論 0 0
  • 喜歡在傷心的時(shí)候,聽(tīng)傷心的歌,喜歡在開(kāi)心的時(shí)候,和在乎的人分享;常常口是心非,想拒絕卻開(kāi)不了口;朋友挺多,但懂我的...
    孫作漲閱讀 259評(píng)論 0 1