学习JDK的动态代理前需要了解静态代理的实现,假设我们有一个接口Moveable,一个类BMW,通过静态代理的方式获取汽车行驶的时间。

一、静态代理

(1)Moveable接口,有个move()方法

package guoli.proxy;

/**
 * @author zhangguoli.cn
 * @date 2018/2/9
 */
public interface Moveable {
    void move();
}

(2)类BMW实现了Moveable接口

package guoli.proxy;

import java.util.Random;

/**
 * @author zhangguoli.cn
 * @date 2018/2/9
 */
public class BMW implements Moveable {
    @Override
    public void move() {
        try {
            System.out.print("汽车行驶中...");
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

(3) TimeCar实现了对BMW行驶的时间记录

package guoli.proxy;

/**
 * @author zhangguoli.cn
 * @date 2018/2/9
 */
public class TimeCar extends BMW {

    @Override
    public void move() {
        System.out.println("汽车开始行驶");
        Long startTime = System.currentTimeMillis();
        super.move();//调用被代理类BMW的move()方法
        Long endTime = System.currentTimeMillis();
        System.out.println("汽车行驶结束... 用时:" + (endTime-startTime) + "毫秒!");
    }
}

(4) 测试类BMWTest

package guoli.proxy;

/**
 * @author zhangguoli.cn
 * @date 2018/2/9
 */
public class BMWTest {
    public static void main(String[] args) {
        TimeCar timeCar = new TimeCar();
        timeCar.move();
    }
}

输出结果大致如下:

汽车开始行驶
汽车行驶中...
汽车行驶结束... 用时:768毫秒!

如果后来Ford也需要记录行驶时间,就需要增加一个FordTime记录Ford的行驶时间;如果需要增加对车行驶距离的记录,还需要增加Distance类记录相关信息。


二、动态代理

JDK动态代理 只能代理实现了某些接口的类。

代理模式的UML类图:

来源网络,侵删

- 阅读剩余部分 -