您的位置:首页 > 编程语言 > Java开发

【Java进阶-Java动态代理与AOP】05 分析InvocationHandler对象的运行原理

2017-08-16 21:08 711 查看

【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基础强化教程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: