2.8 动态代理

less than 1 minute read

2.8.1基础用法

    1. 定义接口
public interface Subject {
    void sayHello();
}

    1. 实现接口
public class MySubject implements Subject {
    public void sayHello() {
        System.out.println("Hello vencial...");
    }
}
    1. 实现InvocationHandler接口
public class MyInvocationHandler implements InvocationHandler {
    private Subject subject;

    public MyInvocationHandler(Subject subject) {
      this.subject = subject;
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {
        method.invoke(subject, args);
    }
}
    1. 调用
    Subject realSubject = new MySubject();

    InvocationHandler handler = new MyInvocationHandler(realSubject);

    /*
        * 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
        * 第一个参数 handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
        * 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
        * 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
    */
      Subject subject = (Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);

      subject.sayHello();

2.8.2 实现原理

  • 核心类是Proxy和InvokeHandler, 由JVM负责生成$proxy0实现类, 该类通过反射调用自定义实现代理类的方法