Java 动态代理

动态代理其实也是代理的一种,所谓动态在于我们的代理类可以适用于所有类型的被代理对象,这一点其实跟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实例。关于代理的好处参见这里 http://www.cnblogs.com/zemliu/archive/2012/05/20/2509377.html

原文地址:https://www.cnblogs.com/zemliu/p/2765518.html