【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基础强化教程》
相关文章推荐
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- 【Java进阶-Java动态代理与AOP】01 代理类的作用与原理及AOP概念
- 【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
- 分析动态代理Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- 黑马程序员--09.动态与代理AOP--05【推理动态代理类内部结构II】【动态代理类运行原理】
- Java JDK 动态代理(AOP)使用及实现原理分析
- 【Java进阶-Java动态代理与AOP】02 创建动态类及查看其方法列表信息
- 【Java进阶-Java动态代理与AOP】
- Java JDK动态代理(AOP)的实现原理与使用详析
- Java -AOP实现原理-动态代理的实现
- Java JDK 动态代理使用及实现原理分析
- 【Java进阶-Java动态代理与AOP】04 实现InvocationHandler的invoke方法
- Spring AOP原理——Java中的动态代理机制
- SpringAOP原理之---Java动态代理