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

【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基础强化教程》

    原文作者:AOP
    原文地址: https://blog.csdn.net/liyazhou0215/article/details/77278321
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞