关于Cglib的浅述

前些天,和以为前辈聊起来动态代理,发现自己还是有些短板的,这里简单梳理一下。

Java中说到动态代理并不陌生,在AOP框架、Spring中、ORM(Hibernate)中等许多情况都会用到;动态代理相对的就有静态代理,不过静态代理使用起来不尽人意,这里不在赘述。这里主要说一下Cglib。

在之前的我的博客里浅述过关于JDK和Cglib的区别和各自的使用情景;但经过知识梳理、自省后,发现对Cglib的底层并没有了解到,这里浅述一下:

Cglib应用情景:动态代理、AOP(在代理中,Cglib会生成代理类的子类,子类中有除了代理类中Final之外的全部行为,同时会对其父类调用进行拦截、目的是织入横向逻辑,实现代理类的加强等效果)、ORM(Hibernate、代理单端情况(二级缓存:一级为session层;二级为sessionFactory层))、LazyLoad(懒加载,通过是否执行对象实例化进行加载,不同情况执行情况多种);

Cglib底层:ASM(字节码操作框架,还有javassist)
我们知道Java是解释性语言,在编程完毕后,后形成.java文件放在磁盘中,这些文件经过解析后会形成.class文件,class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的,这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,通过对.class 文件解析出的二进制信息,生成对应的 Class对象:
在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码,这就是ASM。
ASM 是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
注:不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别。

Cglib相对JDK优势:比JDK功能更强大,速度更快(JDK是通过反射形成代理类),可以针对无接口情况;
Cglib不足:无法代理代理目标的Fianl行为;
上面说的是一些简要的特点;关于Cglib的代理实现代码在之前的博客中https://blog.csdn.net/zghwaicsdn/article/details/50957474已经贴出来了。

阅读更多
版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,不断进步! https://blog.csdn.net/qq_34417408/article/details/79975062
文章标签: Cglib JDK 动态代理
个人分类: JAVA 编译原理 JVM
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭