JDK中實(shí)現(xiàn)動(dòng)態(tài)代理技術(shù)

Java中的動(dòng)態(tài)代理技術(shù)可以動(dòng)態(tài)的創(chuàng)建并且動(dòng)態(tài)處理對(duì)所代理方法的調(diào)用。在動(dòng)態(tài)代理上所做的所有調(diào)用都會(huì)被重定向到單一的調(diào)用處理器,它的工作是揭示調(diào)用的類型并確定相應(yīng)的策略.
下面是實(shí)現(xiàn)動(dòng)態(tài)代理技術(shù)的步驟:

  • 1.編寫(xiě)代理類這個(gè)類實(shí)現(xiàn)InvacationHandler接口
  • 2.寫(xiě)一個(gè)公共接口
  • 3.編寫(xiě)實(shí)際類實(shí)現(xiàn)這個(gè)公共接口
  • 4.使用Proxy.newProxyInstance()靜態(tài)方法得到代理類引用 proxy

1. 寫(xiě)一個(gè)代理類實(shí)現(xiàn)InvacationHandler接口

package com.minglangx.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 

  * @ClassName: MethodSelector
  * @Description: 代理器
  * @author minglangx
  * @date 2017年5月1日 下午3:02:16
  *
 */
public class MethodSelector implements InvocationHandler{
    

    private Object proxied;
    
    public MethodSelector(Object proxied) {
        this.proxied = proxied;
    }
    
    
   /**
     * proxy被代理的對(duì)象
     * Method 代理所調(diào)用的方法
     * args[] 代理對(duì)象調(diào)用方法中參數(shù)組成的集合
     * 該方法實(shí)現(xiàn)對(duì)接口的調(diào)用被重定向?yàn)閷?duì)代理的調(diào)用
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) 
            throws Throwable {
        
        if(method.getName().equals("interesting")) {
            System.out.println("Proxy detected the interesting method");
        }
        
        return method.invoke(proxied, args);
    }

}

2. 寫(xiě)一個(gè)公共接口

package com.minglangx.proxy;
/**
 * 
  * @ClassName: SomeMethods
  * @Description: 公共接口方法
  * @author minglangx
  * @date 2017年5月1日 下午4:26:44
  *
 */
public interface SomeMethods {

    void boring1();
    void boring2();
    void interesting(String arg);
    void boring3();
}

3.實(shí)現(xiàn)類實(shí)現(xiàn)這個(gè)接口

package com.minglangx.proxy;

/**
 * @ClassName: Implementation
 * @Description: 實(shí)際對(duì)象類
 * @author minglangx
 * @date 2017年5月1日 下午3:10:58
 */
public class Implementation implements SomeMethods {

    @Override
    public void boring1() {
        System.out.println("調(diào)用了實(shí)際對(duì)象----boring1");

    }

    @Override
    public void boring3() {
        System.out.println("調(diào)用了實(shí)際對(duì)象----boring3");
    }

    @Override
    public void interesting(String arg) {
        System.out.println("調(diào)用了實(shí)際對(duì)象的方法interesting輸出--" + arg);
    }

    @Override
    public void boring2() {
        System.out.println("調(diào)用了實(shí)際對(duì)象----boring2");

    }

}

4.測(cè)試動(dòng)態(tài)代理

package com.minglangx.proxy;

import java.lang.reflect.Proxy;

/**
 * 
 * 
 * @ClassName: SelectingMethods
 * 
 * @Description: 測(cè)試動(dòng)態(tài)代理類
 * 
 * @author minglangx
 * 
 * @date 2017年5月1日 下午3:14:50
 *
 * 
 * 
 * 
 * 
 */
public class SelectingMethods {

    public static void main(String[] args) {
        /*
         * 這里使用Proxy.newProxyInstance()可以創(chuàng)建動(dòng)態(tài)代理 方法接收3個(gè)參數(shù)
         * (一個(gè)類加載器、一個(gè)實(shí)現(xiàn)InvacationHandler接口的實(shí)現(xiàn)類、 實(shí)際對(duì)象的引用
         */
        SomeMethods proxy =(SomeMethods) Proxy.newProxyInstance(
                SomeMethods.class.getClassLoader(),
                new Class[] { SomeMethods.class }, 
                new MethodSelector(new Implementation()));//這里傳入實(shí)際的對(duì)象必須制定傳入?yún)?shù)類型
        proxy.boring1();
        proxy.boring2();
        proxy.interesting("bonbo");
        proxy.boring3();
    
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容