认识动态代理随笔
1. 什么是动态代理
静态代理是一般是由委托类和代理类实现同一个接口,代理类使用组合的方式来对委托类进行扩展代理过滤等
例如:
interface A{
void say();
}
//委托类
class B implements A{
void say(){
System.out.println("good bye");
}
}
//代理类
class BProxy implements A{
A b;
public BProxy(A b){
this.b = b;
}
void say(){
System.out.println("扩展一下");
b.say();
}
}
静态代理是运行前代理类就已经定义好的了,由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,
被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
而动态代理则是在运行时根据java代码中的指示形成的,一般通过Proxy类和InvocationHandler接口来实现
2, 动态代理中invoke方法是如何自动被调用的
invoke方法有3个参数invoke(Object proxy, Method method, Object[] args)
@param proxy the proxy instance that the method was invoked on
@param method the {@code Method} instance corresponding to
the interface method invoked on the proxy instance.
根据源码对参数的解释可以知道proxy是Proxy类实例,而method则是代理类所调用的委托类的方法对象
args为方法参数
newProxyInstance方法也有3个参数newProxyInstance(ClassLoader loader,Class[] interfaces,
InvocationHandler h)
@param loader the class loader to define the proxy class
@param interfaces the list of interfaces for the proxy class to implement
@param h the invocation handler to dispatch method invocations to
load 是定义代理类的类加载器,
interface 是代理类需要去实现的一些接口(即委托类实现的接口)
h 是一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,
会关联到哪一个InvocationHandler对象上
通过查看
Class cl = getProxyClass0(loader, intfs);
所生成的代理类$Proxy0.class的源码可知,其继承了Proxy类并实现了给定的接口interfaces,当调用方法时,会执行
关联的InvocationHandler对象的invoke方法即
super.h.invoke(this, m4, (Object[])null);