动态代理底层实现

简介: 一般用过动态代理以后会有很多人产生这样的疑问:1.handler是怎么监听到代理对象的方法调用的?2.为什么产生代理对象的时候需要传入接口?直接传入一个实现类,让代理对象持有一个实现类的引用不就应该可以了?以这两个问题为主线,来简单剖析一下动态代理的底层实现。跟踪Proxy.newInstance()跟踪到最底层会看到,代理对象的创建过程如下:

一般用过动态代理以后会有很多人产生这样的疑问:


1.handler是怎么监听到代理对象的方法调用的?


2.为什么产生代理对象的时候需要传入接口?直接传入一个实现类,让代理对象持有一个实现类的引用不就应该可以了?


以这两个问题为主线,来简单剖析一下动态代理的底层实现。

跟踪Proxy.newInstance()跟踪到最底层会看到,代理对象的创建过程如下:

20191121115221157.png总结一下就是,代理对象都是这个格式:


public class $Proxy1 extends Proxy implements 传入的接口{ }


OK,第二个问题首先得到答案:


传入接口是因为底层要通过JIN技术来创建一个实现类(被代理对象)的兄弟对象(代理对象)。


继续来看方法的调用过程:

20191121115825838.png

将代理对象反编译查看其中任意一个接口中的方法:

可以看到其实调用方法的最终是调用handler的invoke方法。

20191121141806570.png

handler是被Proxy对象持有:

Proxy是代理对象的父对象,所以最终还是交给创建代理对象时传入的handler来处理。

20191121142019738.png

目录
打赏
0
0
0
0
22
分享
相关文章
jdk动态代理实现原理
jdk动态代理实现原理
66 0
构造函数继承有什么缺点?
【10月更文挑战第26天】构造函数继承虽然能够实现属性的继承,但在方法继承、内存使用效率、访问父类原型属性以及实现多态性等方面存在一些缺点。在实际开发中,可以根据具体的需求和场景,结合其他继承方式来综合解决这些问题,以实现更高效、更灵活的继承机制。
109 52
|
5月前
|
内部类的优点
我们为什么要使用内部类呢?因为它有以下优点: 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据! 内部类不为同一包的其他类所见,具有很好的封装性; 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。 匿名内部类可以很方便的定义回调。
|
6月前
|
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
58 1
浅析动态代理原理与实现
代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话
151 0
浅析动态代理原理与实现
反射机制优缺点
总结起来,反射机制在Java语言中具有重要的意义,并且在许多实际应用中发挥着关键作用。然而,在使用反射时需要权衡其优缺点,并根据实际需求和场景做出明智的决策,以达到最佳的效果和性能。
245 0
静态代理和动态代理区别(是否有实现类)
静态代理和动态代理区别(是否有实现类)
392 0
静态代理和动态代理区别(是否有实现类)
动态代理学习(二)JDK动态代理源码分析
动态代理学习(二)JDK动态代理源码分析
95 0
动态代理学习(二)JDK动态代理源码分析
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等