JDK动态代理步骤
1. 创建一个实现InvocationHandler接口的类,它必须实现invoke()方法
2. 创建被代理的类及接口
3. 调用Proxy的静态方法,创建一个代理类
4. 通过代理调用方法
代码如下:
- //1. 抽象主题
- public interface Moveable {
- void move() throws Exception;
- }
- //2. 真实主题
- public class Car implements Moveable {
- public void move() throws Exception {
- Thread.sleep(new Random().nextInt(1000));
- System.out.println("汽车行驶中…");
- }
- }
- //3.事务处理器
- public class TimeHandler implements InvocationHandler {
- private Object target;
- public TimeHandler(Object target) {
- super();
- this.target = target;
- }
- /**
- * 参数:
- *proxy 被代理的对象
- *method 被代理对象的方法
- *args 方法的参数
- * 返回:
- *Object 方法返回值
- */
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- long startTime = System.currentTimeMillis();
- System.out.println("汽车开始行驶…");
- method.invoke(target, args);
- long stopTime = System.currentTimeMillis();
- System.out.println("汽车结束行驶…汽车行驶时间:" + (stopTime - startTime) + "毫秒!");
- return null;
- }
- }
- //测试类
- public class Test {
- public static void main(String[] args) throws Exception{
- Car car = new Car();
- InvocationHandler h = new TimeHandler(car);
- Class<?> cls = car.getClass();
- /**
- *loader 类加载器
- *interfaces 实现接口
- *h InvocationHandler
- */
- Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), h);
- m.move();
- }
- }
代码解释:
在测试代码中,Proxy.newProxyInstance()方法需要3个参数:类加载器(要进行代理的类)、被代理类实现的接口,事务处理器。所以先实例化Car,实例化InvocationHandler的子类TimeHandler,将各参数传入Proxy的静态方法newProxyInstance()即可获得Car的代理类,前面的静态代理,代理类是我们编写好的,而动态代理则不需要我们去编写代理类,是在程序中动态生成的。
其中AOP的实现原理就是动态代理,只不过AOP实现基于两种动态代理,分别为CGlib动态代理和JDK动态代理,本文说的问JDK动态代理