AspectJ和ASM有什么区别?

Viy*_*iyu 2 hook aspectj inject java-bytecode-asm

据我了解,这两个框架都是静态的,可将监视代码注入类代码。那么区别是什么呢?

Nán*_*ete 5

ASM是一个框架/库,可为您提供一个API,以操纵现有字节码和/或轻松生成新的字节码。

另一方面,AspectJ是Java语言之上的语言扩展,具有自己的语法,专门用于通过面向方面的编程概念来扩展Java运行时的功能。它包括一个编译器/编织器,可以在编译时运行,也可以在运行时运行。

它们在某种意义上是相似的,都通过对现有字节码的字节码操作和/或生成新的字节码来实现其目标。

从某种意义上讲,ASM更具通用性,因为它对如何修改现有的字节码没有意见,它只是为您提供了一个API,您可以使用它来做任何您想做的事情。另一方面,AspectJ更具体,作用域更窄,它仅支持一些预定义的AOP构造,但是它为您提供了一种接口(aspectj语言),如果您可以将其放入这些构造中,它将更加容易使用为您提供。

在我见过的大多数用例中,AspectJ绰绰有余,但是在极少数情况下,AspectJ不能满足要求,ASM可以是一个不错的选择,但您需要更多的编程工作才能获得类似的结果。