有一些用于动态字节码生成、操作和编织的框架(BCEL、CGLIB、javassist、ASM、MPS)。我想要了解它们,但由于我没有太多时间了解所有它们的所有细节,我希望看到一种比较图,说明其中一种与其他的优缺点以及原因的解释。
在SO中,我发现了许多类似的问题,答案通常是“你可以使用cglib或ASM",或者"javassist比cglib更好”,或者"BCEL很旧,正在消亡“,或者"ASM是最好的,因为它提供了X和Y”。这些答案很有用,但没有在我想要的范围内完全回答问题,更深入地比较了它们,并给出了每个答案的优缺点。
发布于 2012-02-13 12:06:20
如果您对字节码生成感兴趣的仅仅是使用它,那么比较图就会变得相当简单:
你需要理解字节码吗?
对于javassist :否
对于所有其他人:是
当然,即使使用javassist,您有时也可能会遇到字节码的概念。同样,其他一些库(如ASM)具有更高级别的api和/或工具支持,以屏蔽许多字节码细节。
真正区别javassist的是它包含了一个基本的java编译器。这使得编写复杂的类转换变得非常容易:您只需将一个java片段放入字符串中,并使用库将其插入到程序中的特定点。包含的编译器将构建等效的字节码,然后将其插入到现有类中。
发布于 2012-02-08 02:15:28
首先,这取决于你的任务。你想生成新的代码还是分析现有的字节码,以及你可能需要多复杂的分析。还有,你想投入多少时间来学习Java字节码。您可以将字节码框架分解为提供高级API的框架,这样当您需要理解JVM或使用某些字节码生成工具(ASM和BCEL)时,就可以不再学习低级操作码和JVM内部机制(例如,javaassist和CGLIB)和低级框架。对于分析来说,BCEL在历史上进化得更多一些,但ASM提供了一个很好的功能,很容易扩展。还要注意,ASM可能是唯一一个为Java7中默认启用的新字节码验证器所需的STACK_MAP信息提供最高级支持的框架。
https://stackoverflow.com/questions/9167436
复制相似问题