作者:小牛呼噜噜 | https://xiaoniuhululu.com大家好,我是呼噜噜,在之前的一篇文章-Java注解中,我们详细讲解了Java注解及其原理,其中反射调用注解的时候(class.getAnnotation),会继承动态代理类AnotationInvocationHandler,创建注解的代理实例,来让开发者后续操作注解。本篇文章将深入聊聊什么是动态代理
计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」
通俗点讲,本来我们只可直接去商店买药 ;突然有一天,我们的车坏了,导致我们无法直接去商店买药。这个时候,又急着需要药,我们可以打电话叫代理人:小张去商店帮我们买药,然后再让他把药给我们带回来。这样最终我们拿到了药。
示例
- 定义一个接口及其实现类;
- 创建一个代理类同样实现这个接口
- 将目标对象注入进代理类,然后就可以在代理类的对应方法调用目标类中的对应方法
买药前,先去买蛋糕。。。静态代理的缺陷
买药。。。
买药后,再去买水果。。。
推荐阅读:https://mp.weixin.qq.com/s/tsbDfyYLqr3ctzwHirQ8UQ创建一个实例对象的底层逻辑,其实与.class文件和Class对象息息相关
加载阶段:指的是将类对应的.class文件中的二进制字节流读入到内存中,将这个字节流转化为方法区的运行时数据结构,然后在堆区创建一个java.lang.Class 对象,作为对方法区中这些数据的访问入口其中将类对应的.class文件中的二进制字节流读入到内存中,JVM虚拟机规范并没有
在笔者之前讲解Java反射的文章https://mp.weixin.qq.com/s/_n8HTIjkw7Emcunpb4-Iwg中,我们知晓:
- 从ZIP包获取,这是JAR、EAR、WAR等格式的基础
- 从网络中获取,典型的应用是 Applet
- 运行时计算生成,这种场景使用最多的是动态代理技术,在 java.lang.reflect.Proxy 类中,就是用了 ProxyGenerator.generateProxyClass 来为特定接口生成形式为 *$Proxy 的代理类的二进制字节流
- 由其他文件生成,典型场景是JSP应用,由JSP文件生成对应的Class文件。
- 从数据库中读取,这种场景相对少见些,例如有些中间件服务器(如SAP Netweaver)可以选择 把程序安装到数据库中来完成程序代码在集群间的分发。
- 可以从加密文件中获取,这是典型的防Class文件被反编译的保护措施,通过加载时解密Class文 件来保障程序运行逻辑不被窥探。
before method buyMed这样我们就能够实现代码复用,增加程序的解耦能力,解决静态代理的缺陷。
买药。。。
after method buyMed
Class类就像 普通类的模板 一样,用来保存“类所有相关信息”的类。大概有3个步骤:
before method work由于本文篇幅过长且CGLIB不是本文的重点 ,CGLIB源码分析就不展开了,待后面有空出一下。
上班。。。
after method work
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |