问题描述
ASM的ClassVisitor
构造函数需要传递Opcodes
的ASM4
,ASM5
,ASM6
,ASM7
中的一个,ASM8
或ASM9
。
如何知道每个Java版本要使用哪个ASM#
?我将在Java 8中使用什么ASM#
?我将在Java 11中使用什么ASM#
?
解决方法
ASM…
常量描述了软件所需的最低 ASM库版本。这对于兼容性至关重要,例如在Visitor API中,就像您要覆盖旧版本中不存在的方法一样,当您链接到旧版本时也不会注意到。该方法永远不会被调用。
因此,使用ASM…
常量可以更早地发现此类问题。这就是为什么某些实现类提供a constructors not requiring the version number而不允许子类的原因,而它们的constructor for subclasses确实需要它。由于只有子类才能覆盖方法,因此会受到此问题的影响。
如果您不打算将软件与ASM库的较早版本一起使用,则只需使用与当前ASM库版本相对应的数字即可,即最高的数字,不带后缀EXPERIMENTAL
。否则,我建议在开发和测试期间使用旧版本,这再次允许只使用该版本中现有的最高ASM…
号。
您可以使用最新的ASM库来生成针对所有版本的类。这取决于您传递给visit
方法的版本。对于Java 8是V1_8
,对于Java 11是V11
。这些常量的实际值与the versions of the JVM specification相同。
据我所知,没有简单的方法,但是changelog of ASM有很大帮助。请注意,这些版本是指ASM版本, NOT 类文件格式版本。