2.8 动态代理
less than 1 minute read
2.8.1基础用法
public interface Subject {
void sayHello();
}
public class MySubject implements Subject {
public void sayHello() {
System.out.println("Hello vencial...");
}
}
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);
}
}
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实现类, 该类通过反射调用自定义实现代理类的方法