1

用于运行时字节码生成的许多库(工具) ASM,Javassit,CGLIB,BCEL。所有这些工具都能够动态地操作java字节码,这与javac编译器等工具不同。用于较大方法/类的运行时字节码生成

我的理解是生成字节码并稍后将它们加载到类加载器中。对我而言,问题是在生成可能非常大的Java方法/类的字节码时,这些工具之间是否存在性能差异和问题。

另一个方案是应用其保持在时间运行,并且将所生成的字节码将是微不足道的,但是连续的(应用不断产生的字节代码的类和装载/卸载到类加载器连续地)

还有另一个Dynamic Java Bytecode Manipulation Framework Comparison但我还没有得到回答。如果有些人可以提供有用的链接,或者形成学术/行业的调查/报告,我将不胜感激。

回答

0

在运行时生成类并不比填充包含内容的字节数组更有趣。在JVM被告知将这些内容解释为Java类的地方,它与从硬盘驱动器加载的预编译类被添加到运行时环境的方式没有什么不同。

由于填充字节数组很微不足道,所以性能取决于确定内容的规则。解析源代码并验证其正确性是一项昂贵的任务。另一方面,根据硬编码规则生成代码,例如,通过调用一个指定的方法(如lambda instantiation works)来实现一个接口,通常比从硬盘驱动器加载等效代码的速度快得多。具有这样的规则是运行时字节码生成的典型用例。

但是在考虑性能之前,您应该问自己为什么要考虑动态字节码生成。在大多数现实生活场景中,对这个问题的回答已经包含了对性能是否与所有相关的问题或者为什么预计通过生成代码来改进的问题的答案。

1

在现实世界中,使用哪个框架并不重要。除非您计划生成数百万种新方法并在运行时加载它们,否则开始时这将是一个糟糕的主意。

0

我认为ASM是最强的选择有两个原因。首先,它具有所有JVM特性的最新功能,其次,它的Visitor Pattern API非常高效。这个第二点解决了你的性能问题,我想。