1. 程式人生 > >模式的秘密-代理模式(2)-JDK動態代理

模式的秘密-代理模式(2)-JDK動態代理

handler ins strong alt mov .... implement class 以及

代理模式-動態代理

(1)

技術分享圖片

(2)

技術分享圖片

代碼實踐動態代理:

第一步:被代理類的接口:

package com.JdkProxy;

public interface Moveable {
    
    void move();

}

第二步:被代理類:

package com.JdkProxy;

import java.util.Random;

public class Car implements Moveable {

    @Override
    public void move()
    {

        //實現開車
        try {
            Thread.sleep(
new Random().nextInt(1000)); System.out.println("汽車行駛中...."); } catch (InterruptedException e) { e.printStackTrace(); } } }

第三步:代理類:實現接口:InvocationHandler,同時把被代理類對象接口傳入構造方法,

重寫的接口的invoke方法。

package com.JdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class TimeHandler implements InvocationHandler { private Object target; public TimeHandler(Object target) { this.target=target; } /* * 參數: * proxy:被代理對象 * method:被代理對象方法 * arg:方法的參數 * 返回值: * Object 方法的返回值 *
*/ @Override public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { long starttime=System.currentTimeMillis(); System.out.println("汽車開始形式...."); method.invoke(target); long endtime=System.currentTimeMillis(); System.out.println("汽車結束行駛...汽車形式時間:"+(endtime-starttime)+"毫秒"); return null; } }

測試類中實現代理:

使用Proxy類的newProxyInstance方法產生一個被代理類的實例,該實例可以當作被代理類使用接口(對應cls.getInterfaces())中聲明過的方法。

package com.JdkProxy;

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

public class Test {
    
    /*JDK動態代理測試類
     * */
    public static void main(String[] args) {
        
        Car car=new Car();
        
        //InvocationHandler是一個接口,接口中定義了一個方法invoke。要想實現JDK動態代理,
        //代理類必須繼承這個接口
        InvocationHandler h=new TimeHandler(car);//
        Class cls=car.getClass();//獲取類對象,以便獲取類加載器,以及獲取類的接口
        
        /*
         * newProxyInstance返回代理類的實例,返回後的代理類可以當作被代理類使用
         * (可使用被代理類的接口中聲明過的方法)
         * loader:類加載器
         * interfaces:實現接口
         * h:InvocationHandler
         * */
        Moveable m=(Moveable) Proxy.newProxyInstance(cls.getClassLoader(), 
                cls.getInterfaces(), h);
        m.move();
        
    }

}

測試結果:

汽車開始形式....
汽車行駛中....
汽車結束行駛...汽車形式時間:863毫秒

代理模式-動態代理

所以動態代理是這樣一種Class:

  • 他在運行時候產生了的Class
  • 該class需要實現一組interface
  • 使用動態代理類時,必須實現InvocationHandler接口

動態代理實現步驟

1,創建一個實現InvocationHandler的類,他必須實現Invoke方法

2,創建被代理的類以及接口

3,調用Proxy的靜態方法,創建一個代理類:

newProxyInstance(ClassLoader,class[] interfaces,InvocationHandler h)。

4,通過代理調用方法。

jdk動態代理只能實現了接口的類。

模式的秘密-代理模式(2)-JDK動態代理