【发布时间】:2020-12-03 13:39:46
【问题描述】:
ASM 的ClassVisitor 构造函数需要传递Opcodes 的ASM4、ASM5、ASM6、ASM7、ASM8 或ASM9 之一。
我如何知道每个 Java 版本使用哪个 ASM#?我会为 Java 8 使用什么 ASM#?我会为 Java 11 使用什么 ASM#?
【问题讨论】:
标签: java version java-bytecode-asm
ASM 的ClassVisitor 构造函数需要传递Opcodes 的ASM4、ASM5、ASM6、ASM7、ASM8 或ASM9 之一。
我如何知道每个 Java 版本使用哪个 ASM#?我会为 Java 8 使用什么 ASM#?我会为 Java 11 使用什么 ASM#?
【问题讨论】:
标签: java version java-bytecode-asm
ASM… 常量描述了您的软件所需的最低 ASM 库版本。这对于兼容性至关重要,例如在访问者 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 版本,不是类文件格式版本。
【讨论】: