美文网首页
自己动手写一个jdk动态代理

自己动手写一个jdk动态代理

作者: tracy_668 | 来源:发表于2018-03-27 16:28 被阅读74次

1.1 为什么要用动态代理

       学一个东西,感觉比较好的方式是问自己它为什么要存在?学习java动态代理首先需要理解为什么要动态代理?使用代理是为了把一些通用的业务逻辑统一到代理中实现,而使得被代理对象专注于自身功能的实现。比如计算一个类中方法的运行时间,如果使用静态代理组合的方式实现:

       如果只有一个两个类需要代理,写几个代理类倒也无所谓,但是当需要使用代理的类很多,成百上千时,每个类都需要一个代理类,这样代理类数目就太多了,显得太臃肿,那么能不能只使用一个通用的代理类来实现相同功能代理,避免对每个类都实现一个代理,这时动态代理就可以派上用场了。

      java中的动态代理是指在程序运行过程中动态的生成java文件并编译成class文件,而不是像静态代理那种在程序运行前就有了相应的代理class文件。

    需要动态的生成阴影并编译阴影部分的代码,实现动态编译的方法有多种,比如jdk自带的compiler , CGLIB, ASM(直接生成二进制代码)

1.2 jdk动态代理的原理

        如上图所示,compile后会生成相应的calss文件,然后把class文件load到内存,由于此class文件不在ClassPath下,不能用常规的classloader来load,而是使用UrlClassLoader来加载,该代理实现了moveable接口,如果实现任意接口的代理呢?把要实现的接口名通过传参的方式即可。

      至此,不同的代理类只需要写相应的handler即可,不同的handler对应不同逻辑的代理,这样对于同一类型的代理只需要写一个handler就可以,而不是针对所有被代理的类都写一个代理类,这大大减少了冗余代码和工作量。从上面也可以看出,jdk的动态代理只能对接口代理,要求被代理的类需要实现某一接口,否则无法被代理。

相关文章

网友评论

      本文标题:自己动手写一个jdk动态代理

      本文链接:https://www.haomeiwen.com/subject/spejcftx.html