cglib
首先cglib是一个工具库,一般用来对对象进行代理以实现一些功能的增强,例如 before,after,exception,return 等等,cglib可以理解成是一个框架,底层用到了aop概念,aspect 代码织入等等。
aspect
aspect底层使用了asm技术,asm技术是对java bytecode 进行操作的一个框架技术,jvm对class的加载是建立在字节码的基础上,字节码的生成有2种,一种是我们手码,另一种就可以通过asm来动态的创建和修改生成新的字节码。
java class被定义在.class文件中,里面有类对象所有的元数据信息,例如类名,修饰符,变量名,方法等等定义。asm可以对字节码进行解析,然后生成新的字节码。aspect通过自己的agent加载器当然也可以在加载目标类时,直接通过asm来动态的修改class后将新的字节码进行加载。
2.ASM 跟传说中的AOP三剑客APT、aspectJ、Javassit有什么关系?(https://www.jianshu.com/p/a1e6b3abd789)
分别解释下这几个名词
APT:APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解。注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。简单来说就是在编译期,通过注解生成.java文件
aspectJ:AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的[编译器]用来生成遵守Java字节编码规范的Class文件。适合在某一个方法前后插入部分代码,处理某些逻辑:比如方法运行时间、插入动态权限检查等。问题会造成很多的冗余代码,产生很多代理类。简单来说就是在生成class时动态织入代码
Javassit: Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba(千叶滋)所创建的。简单来说就是源码级别的api去修改字节码
byte code解释:https://www.jianshu.com/p/92a75a18cbc1