Java动态代理invoke方法自动执行的原因

在动态代理中,一般的是先调用Proxy.newProxyInstance()生成代理对象,然后通过调用代理对象的对应方法来实现增强,这里假设代理了被代理对象的test()方法。其中增强的逻辑写在处理器中(InvocationHandler处理器常通过匿名内部类创建)。当调用代理对象的test方法时,处理器中的invoke方法会自动执行,这一点较难理解。以下尝试从源码的角度对动态代理的机制进行简要分析。

Proxy类中的主体部分:


public class Proxy  implements Serializable{//the invocation handler for this proxy instance.protected InvocationHandler h;}/** parameter types of a proxy class constructor */private static final Class<?>[] constructorParams ={ InvocationHandler.class };//构造器protected Proxy(InvocationHandler h) {        this.h = h;}//该方法返回类型为(com.sun.proxy.$Proxy0)的代理对像public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)//Look up or generate the designated proxy class.        Class<?> cl = getProxyClass0(loader, intfs);final Constructor<?> cons = cl.getConstructor(constructorParams);final InvocationHandler ih = h;        return cons.newInstance(new Object[]{h});        }

$Proxy0类中的主体(代理对象是该类的实例)


//以下代码由$Proxy0.class反编译得到
public final class $Proxy0 extends Proxy implements PorxyInte {private static Method m3;    static {        m3 = Class.forName("cn.itcast.web.Test.PorxyInte").getMethod("test", new Class[0]);            }    //构造方法。将invocationhandler实例从代理类赋值到父类public $Proxy0(InvocationHandler invocationhandler){super(invocationhandler);//创建父类对象}//此处可以看出,当调用代理类的test方法,会执行父类对象属性h的invoke方法,//h即为通过匿名内部类创建的处理器对象public final void test() {super.h.invoke(this, m3, null);    //这里的this是代理对象,m3为test方法
}

通过匿名内部类创建处理器(InvocationHandler对象),

即Proxy.newProxyInstance()方法中的第三个参数

new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//此处可以写增强参数和方法的代码            Object result = method.invoke(proImp,null);return result;//此处可以写增强结果的代码
}

通过以上代码不难看出,代理对象创建时也创建了父类对象,并将处理器传给了父类对象,通过调用代理对象的test()方法,执行了父类对象中处理器的invoke方法。

说明:为了直观,本文中修改了部分源代码,若有理解不当的地方,欢迎批评指正!
更详细的分析,可以参考“码到”的博文:
https://blog.csdn.net/qq_39056197/article/details/102598674

Java动态代理invoke方法自动执行的原因相关推荐

  1. jdk动态代理invoke方法自动运行原因

    invoke 方法介绍 想要知道 invoke方法为什么会自动调用我们先要来了解一下这个方法 public interface InvocationHandler { public Object in ...

  2. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  3. java动态代理三座大山InvocationHandler、newProxyInstance()和invoke()

    先分享记录些博主的文章: <SSM框架>2Spring详解-KuangStudy-文章 java动态代理Proxy.newProxyInstance_徐海兴的专栏-CSDN博客_proxy ...

  4. Java动态代理机制

    在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...

  5. JAVA 动态代理学习记录

    打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...

  6. Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

    Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创  (参与分:36,专家分:90)   发表:2004-9-3 上午9:37   版本:1.0   阅读:160 ...

  7. Java 动态代理机制分析及扩展--转

    http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...

  8. Java 动态代理机制分析及扩展,第 1 部分

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  9. Java 动态代理机制分析及扩展

    简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动 ...

最新文章

  1. vs2015 ctrl 单击 转到定义
  2. Java线程通俗讲解
  3. 电脑一复制粘贴就卡死_油门突然卡死,踩刹车根本没用该怎么办?看看老司机怎么说...
  4. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说
  5. 锡山国土推行数据中心“在线变更”
  6. c语言中参数的传递方式是,C语言函数的参数及传递方式
  7. tensorflow 里metrics_深入理解TensorFlow中的tf.metrics算子
  8. win7 建立无线wifi执点全过程
  9. spring配置文件最全约束
  10. 可重构计算芯片是未来吗?开发者如何抓住这一机会
  11. 数据结构经典案例_《数据结构》书评与 MOOC 推荐
  12. 再战图形,一图一世界
  13. 12306ByTicket1.1操作手册
  14. 实对称矩阵必可正交相似对角化
  15. Hi3559A 开发总结--使用docker
  16. The overload Pattern
  17. IIS部署添加网站发布网站
  18. HTML基础常识问答(二)
  19. Codeforces Global Round 21 E. Placing Jinas
  20. HIT CS:APP 计算机系统大作业 《程序人生-Hello’s P2P》

热门文章

  1. MSP430G2433IPW28R 混合信号微处理器 封装:TSSOP28
  2. 数据库密钥过期了怎么办?
  3. 深入浅出TensorFlow2函数——tf.data.Dataset.batch
  4. 怎么用git在本地生成密钥_git上传代码到远程仓库(附:生成秘钥)
  5. netty 物联网项目总结
  6. python自动化测试之Appium自动化测试环境搭建
  7. excel冻结窗口怎么设置_Excel表格技巧—怎么给表格设置密码
  8. 无失真压缩法可以减少冗余_多媒体压缩技术概念 多媒体的基本概念
  9. 360浏览器自动刷新选项设置方法
  10. Ae效果控件快速参考:模拟