Atitti 类库 开发者 常用 api
目录
如果你正在编写一个框架或者类库。有一些受欢迎的字节码库如javassist和Cglib Nodep asm可以供你选择,他们可以让你阅读和修改应用程序生成的字节码。
目前字节码修改技术有ASM,javassist,cglib,BCEL等。cglib就是基于封装的Asm. Spring 就是使用cglib代理库。关于cglib的使用介绍,
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架
java动态性的两种常见实现方式
- 字节码操作
- 反射
运行时操作字节码可以让我们实现如下功能:
- 动态生成新的类
- 动态改变某个类的结构(添加/删除/修改 新的属性/方法)
优势:
- 比反射开销小,性能高
- JAVAasist性能高于反射,低于ASM
CGLIB
是一个强大的,高性能,高质量的Code生成类库,基于ASM实现。
JAVAssist
- 是一个开源的分析、编辑和创建java字节码的类库,性能较ASM差,跟cglib查不到,但是使用简单
JAVAssist库的API
- javassist最外层的API和Java的反射包中的API颇为类似、
- 它主要有CtClass,CtMethod,以及CtField及各类组成。用以执行和JDK反射API中java.lang.Class,java.lang.reflect.Method,java.lang.reflect.Method.Field相同的操作。
局限性:
- JDK5.0行语法不支持(包括泛型、枚举),不支持注解修改,但可以通过底层的javassist类来解决,具体参考javassist.bytecode.annotation
- 不支持数组的初始化,如String[]{“1”,“2”},除非只有数组的容量为1
- 不支持内部类和匿名类
- 不支持continue和btreak表达式
- 对于继承关系,有些不支持,例如: