动态代理其实也是代理的一种,所谓动态在于我们的代理类可以适用于所有类型的被代理对象,这一点其实跟PHP的__call()方法是一样的。
public interface Flyable { void fly();}public class Eagle implements Flyable { @Override public void fly() { System.out.println("I am eagle, I can fly in 100 km/h"); }}import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler { private Object proxied = null; public DynamicProxy(Object proxied) { this.proxied = proxied; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Using dynamic proxy " + proxy.getClass() + " method : " + method + " args : " + args); return method.invoke(proxied, args); }}import java.lang.reflect.Proxy;public class Test { public static void main(String[] args) { Eagle eagle = new Eagle(); Flyable flyProxy = (Flyable) Proxy.newProxyInstance( Flyable.class.getClassLoader(), new Class[] { Flyable.class }, new DynamicProxy(eagle) ); flyProxy.fly(); }}
Java的动态代理理解起来有点绕,他需要一个InvocationHandler对象,这个东西就是我们的代理对象,里面放了一个Object proxied,这个就是被代理对象,invoke()方法其实就是在用反射在调用proxied的方法。客户端使用Proxy.newProxyInstance()方法创建代理类,需要传入的参数有ClassLoader,代理类需要实现的接口的Class,以及代理类,当然还有代理类的里面的proxied实例。关于代理的好处参见这里