用图片来表示动态代理的代理对象创建流程和方法执行,待完善。
package designpattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 使用 Java 动态代理。具体有如下四步骤:
* 1、通过实现 InvocationHandler 接口创建自己的调用处理器;
* 2、通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
* 3、通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
* 4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
*/
public class DynamicProxyTest {
public static void main(String[] args) {
// InvocationHandlerImpl 实现了 InvocationHandler 接口,并能实现方法调用从代理类到委托类的分派转发
// 其内部通常包含指向委托类实例的引用,用于真正执行分派转发过来的方法调用
Resource resource = new ConcreateResource();
InvocationHandler invocationHandler = new DynamicProxy(resource);
// 该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), Resource.class.getInterfaces(), invocationHandler);
resource.operationA();
}
}
class DynamicProxy implements InvocationHandler {
private Resource resource;
public DynamicProxy(Resource resource) {
super();
this.resource = resource;
}
// 该方法负责集中处理动态代理类上的所有方法调用。第一个参数既是代理类实例,第二个参数是被调用的方法对象
// 第三个方法是调用参数。调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(resource, args);
}
}
interface Resource {
public void operationA();
public void operationB();
}
class ConcreateResource implements Resource {
@Override
public void operationA() {
System.out.println("A");
}
@Override
public void operationB() {
System.out.println("B");
}
}