Java Javassist/ASM 框架比较
2019-09-25 本文已影响0人
许方镇
Javassist:
- Javassist (Java编程助手)使操作Java字节码变得简单。它是一个用于编辑Java字节码的类库;跟其他类似的字节码编辑器不同的是,它使Java程序能够在运行时定义一个新类,并在JVM加载类文件时修改它。
- Javassist提供了两种级别的API:源级别和字节码级别。如果用户使用源代码级API,他们可以不需要了解Java字节码的规范的前提下编辑类文件。整个API仅使用Java语言的词汇表设计。甚至你可以以源文本的形式插入字节码中;Javassist动态编译它。另一方面,字节码级API允许用户作为编辑器直接编辑类文件。
- Javassist允许您检查、编辑和创建Java二进制类。
- Javassist并不是唯一处理字节码的库,但它有一个特别功能,使其成为一个重要的开始来尝试字节码工作:你可以使用Javassist改变一个Java类的字节码而不需要学习任何关于字节码或Java虚拟机(JVM)的体系结构。
- 面向切面编程:Javassist可以是一个很好的工具用于向类中添加新方法,以及在调用方和被调用方两边插入before/after/around通知。
- 反射:Javassist另一个应用就是运行时反射;Javassist允许Java程序使用一个元对象,该元对象控制基级别对象上的方法调用。不需要专门的编译器或虚拟机。
- Javassist还提供了用于直接编辑类文件的低级API。要使用此级别的API,您需要详细了解Java字节码和类文件格式,而此级别的API允许您对类文件进行任何类型的修改。
ASM
- ASM是一个通用的Java字节码操作和分析框架。它可以直接以二进制形式修改现有类或动态生成类。提供了通用的转换和分析算法,允许轻松地组装定制的复杂转换和代码分析工具。
- ASM提供了与其他字节码框架类似的功能,但它关注的是使用的简单性和性能。因为它的设计和实现尽可能的小和快,所以它非常适合在动态系统中使用。
- ASM是一个Java类操作工具,用于动态生成和操作Java类,这是实现可适应系统的有用技术。ASM基于一种新的方法,与现有的相似工具相比,后者包括使用“访问者”设计模式,而不显式地用对象表示被访问的树。对于大多数实际需求,这种新方法比现有的工具提供了更好的性能。
Javassist & ASM 对比
- Javassist源代码级API比ASM中实际的字节码操作更容易使用
- Javassist在复杂的字节码级操作上提供了更高级别的抽象层。Javassist源代码级API只需要很少的字节码知识,甚至不需要任何实际字节码知识,因此实现起来更容易、更快。
- Javassist使用反射机制,这使得它比运行时使用Classworking技术的ASM慢。
- 总的来说ASM比Javassist快得多,并且提供了更好的性能。Javassist使用Java源代码的简化版本,然后将其编译成字节码。这使得Javassist非常容易使用,但是它也将字节码的使用限制在Javassist源代码的限制之内。
- 总之,如果有人需要更简单的方法来动态操作或创建Java类,那么应该使用Javassist API 。如果需要注重性能地方,应该使用ASM库。
类构造时间
Framework | First time | Later times |
---|---|---|
Javassist | 257 | 5.2 |
ASM | 62.4 | 1.1 |
表结果表明ASM确实比其他框架更快,这一优势既适用于启动时间,也适用于重复使用。