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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值