Java 动态代理的简单理解

2016/4/23 posted in  Java学习  

动态代理作用

动态代理是 Java SE 1.3 新增的特性,利用动态代理可以在运行时创建一个实现了一组给定接口的新类。因此动态代理代理的是接口,不是类。

使用动态代理的场景:
* 一个接口的实现在编译时无法知道,需要在运行时才能实现
* 实现更加通用的适配器(Adapter)和装饰器(Decorator)
* 面向切面编程的支持

动态代理实例

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

public class Application {
    public static void main(String[] args) throws InterruptedException {
        final Cat cat = new Cat();
        Animal proxy = (Animal) Proxy.newProxyInstance(
                cat.getClass().getClassLoader(),
                new Class[]{Animal.class},
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("Before invoke");
                        return method.invoke(cat, args);
                    }
                });
        proxy.run();
    }
}

interface Animal {
    void run();
}

class Cat implements Animal {

    public void run() {
        System.out.println("Cat is running");
    }
}

动态代理类特性

  1. 类名以 $Proxy 开头
  2. 代理类继承自 java.lang.reflect.Proxy
  3. 调用 Proxy.isProxyClass 方法返回 true
  4. 代理类严格按顺序实现所有的接口(当实现的几个接口中有重复的方法时,代理类总是从最前面的接口获取方法对象,并分派给调用处理器)
  5. 在代理类实例上调用其代理的接口中所声明的方法时,最终都会由调用处理器的 invoke 方法执行;此外,java.lang.Object 中的 public,非 final 方法也会分派给调用处理器 invoke 方法执行,如:hashCode,equals,toString