答复: Java动态代理的设计是否有缺陷??

引用

我的疑问:
1、在InvocationHandler中的invoke方法中的那个参数 proxy
不能调用toString、hashCode方法;
虽然可以转型为 实体类,但是 不能 在 method.invoke(obj,args)中使用。
不知道这个参数有什么用???
2、既然proxy不知道怎么用,于是,就自己添加个 setTarget(Object  target)方法,注入具体的对象。



public interface InvocationHandler{
    Object invoke (Object proxy, Method method, Object[] args) throws Throwable;
}

此invoke将拦截所有代理的方法调用,包含了继承自Object的方法

 

1. 可以调用toString()和hashCode()方法的,需要自己在invoke中进行处理如:

Object invoke (Object proxy, Method method, Object[] args) throws Throwable{

    if (method.getName().equals('toString')) {....}

    else if (method.getName().equals('hasCode')) {....}

}

实际上你任何执行此方法都是错误的:method.invoke(proxy, argus),注意这里的proxy本身就是代理,如果代理执行invoke,那么还是会被InvocationHandler.invoke拦截的,也就是任何method.invoke(proxy,argus)依然还是对InvocationHandler.invoke的调用 ,恭喜从此进入死循环了

 

2 代理可以是对真实存在的对象进行代理,

所以你需要方法setTarget(),更好的做法是在构造InvocationHandler时输入,如:

new MyInvocationHandler(target);

你可以使用

Object invoke (Object proxy, Method method, Object[] args) throws Throwable{

    if (method.getName().equals('toString') || method.getName().equals('hasCode')) {return method.inoke(target, args); }

}

3 代理也可以是一个虚幻的对象实例,只是这个实例的所有方法实现在InvocationHandler.invoke 中实现的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值