Javassist/ASM 框架比较

Posted 董俊杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javassist/ASM 框架比较相关的知识,希望对你有一定的参考价值。

Javassist:

  1. Javassist (Java编程助手)使操作Java字节码变得简单。它是一个用于编辑Java字节码的类库;跟其他类似的字节码编辑器不同的是,它使Java程序能够在运行时定义一个新类,并在JVM加载类文件时修改它。
  2. Javassist提供了两种级别的API:源级别和字节码级别。如果用户使用源代码级API,他们可以不需要了解Java字节码的规范的前提下编辑类文件。整个API仅使用Java语言的词汇表设计。甚至你可以以源文本的形式插入字节码中;Javassist动态编译它。另一方面,字节码级API允许用户作为编辑器直接编辑类文件。
  3. Javassist允许您检查、编辑和创建Java二进制类。
  4. Javassist并不是唯一处理字节码的库,但它有一个特别功能,使其成为一个重要的开始来尝试字节码工作:你可以使用Javassist改变一个Java类的字节码而不需要学习任何关于字节码或Java虚拟机(JVM)的体系结构。
  5. 面向切面编程:Javassist可以是一个很好的工具用于向类中添加新方法,以及在调用方和被调用方两边插入before/after/around通知。
  6. 反射:Javassist另一个应用就是运行时反射;Javassist允许Java程序使用一个元对象,该元对象控制基级别对象上的方法调用。不需要专门的编译器或虚拟机。
  7. Javassist还提供了用于直接编辑类文件的低级API。要使用此级别的API,您需要详细了解Java字节码和类文件格式,而此级别的API允许您对类文件进行任何类型的修改。

ASM

  1. ASM是一个通用的Java字节码操作和分析框架。它可以直接以二进制形式修改现有类或动态生成类。提供了通用的转换和分析算法,允许轻松地组装定制的复杂转换和代码分析工具。
  2. ASM提供了与其他字节码框架类似的功能,但它关注的是使用的简单性和性能。因为它的设计和实现尽可能的小和快,所以它非常适合在动态系统中使用。
  3. ASM是一个Java类操作工具,用于动态生成和操作Java类,这是实现可适应系统的有用技术。ASM基于一种新的方法,与现有的相似工具相比,后者包括使用“访问者”设计模式,而不显式地用对象表示被访问的树。对于大多数实际需求,这种新方法比现有的工具提供了更好的性能。

Javassist & ASM 对比

  1. Javassist源代码级API比ASM中实际的字节码操作更容易使用
  2. Javassist在复杂的字节码级操作上提供了更高级别的抽象层。Javassist源代码级API只需要很少的字节码知识,甚至不需要任何实际字节码知识,因此实现起来更容易、更快。
  3. Javassist使用反射机制,这使得它比运行时使用Classworking技术的ASM慢。
  4. 总的来说ASM比Javassist快得多,并且提供了更好的性能。Javassist使用Java源代码的简化版本,然后将其编译成字节码。这使得Javassist非常容易使用,但是它也将字节码的使用限制在Javassist源代码的限制之内。
  5. 总之,如果有人需要更简单的方法来动态操作或创建Java类,那么应该使用Javassist API 。如果需要注重性能地方,应该使用ASM库。

类构造时间

FrameworkFirst timeLater times
Javassist 257 5.2
ASM 62.4 1.1

表结果表明ASM确实比其他框架更快,这一优势既适用于启动时间,也适用于重复使用。



链接:https://www.jianshu.com/p/f2a4c7d3745d

以上是关于Javassist/ASM 框架比较的主要内容,如果未能解决你的问题,请参考以下文章

ASM学习记录

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

Spring框架学习06——AOP底层实现原理

动态代理模式——JDK动态代理

Tomcat 在没有任何日志或任何堆栈的情况下停止