【Java进阶-Java动态代理与AOP】05 分析InvocationHandler对象的运行原理
分析InvocationHandler对象的运行原理
猜想分析动态生成的类的内部代码
动态生成的类实现了Collection接口(可以实现若干接口),生成的类有Collection接口中的所有方法和一个如下接口InvocationHandler参数的构造方法。
动态代理类的构造方法
构造方法接受一个InvocationHandler对象,接受对象了要干什么呢?该方法内部的代码会是怎样的呢?
赋值给内部引用变量,以后使用。
$Proxy0 implements Collection
{
InvocationHandler handler;
public $Proxy0(InvocationHandler handler){ this.handler = handler;
}
}
动态代理类的成员方法
实现的Collection接口中的各个方法的代码又是怎样的呢?
InvocationHandler接口中的定义的invoke方法接受的三个参数又是什么意思?
client程序调用objProxy.add(“aaa”);方法时,涉及三要素:objProxy对象、add方法、”aaa”参数
Class $Proxy0{
add(Object object){
return handler.invoke(Object proxy, Method method, Object[] args);
}
}
当collProxy.add(“aaa”)时,会将collProxy传递给代理对象,”add”以字符串形式传递进去用于生成Method方法,参数是”aaa”
boolean add(Object obj){
Method method = this.getClass().getMethod("add", obj.getClass);
return handler.invoke(this, method, "aaa");
}
当collProxy.size()时,会将collProxy传递给代理对象(下面的this), “size”以字符串形式传递进去用于生成Method方法,参数是null
// 生成的Collection接口中的方法的运行原理
int size(){
Method method = this.getClass().getMethod("size")
return handler.invoke(this, method, null);
}
分析先前打印动态类的实例对象时,结果为什么会是null呢?
调用有基本类型返回值的方法时为什么会出现NullPointerException异常?
因为InvocationHandler中的invoke方法返回的类型和调用的方法返回的类型不一致导致的。
分析为什么动态类的实例对象的getClass()方法返回了正确结果呢?
collProxy.getClass().getName(); // $Proxy0,为什么没有转发给invoke方法呢?
调用代理对象的从Object类继承的hashCode,equals,或者 toString这几个方法时,代理对象将调用请求转发给InvocationHandler对象,对于其他方法,则不转发调用请求。(Proxy文档)
参考:
《Java基础强化教程》