java - 如何将 Opcodes 中 ASM 的 API 版本映射到 Java 版本?

标签 java version java-bytecode-asm

ASM ClassVisitor 构造函数需要传递 Opcodes 之一的 ASM4 , ASM5 , ASM6 , ASM7 , ASM8 ASM9 .
我怎么知道是哪个 ASM#用于每个版本的Java?什么 ASM#我会用于 Java 8 吗?什么 ASM#我会用于 Java 11 吗?

最佳答案

ASM…常量描述了您的软件所需的最低 ASM 库版本。这对于兼容性至关重要,例如在访问者 API 中,当您覆盖旧版本中不存在的方法时,您在链接旧版本时不会注意到。该方法永远不会被调用。
因此,使用 ASM…常数允许更早地发现此类问题。这就是为什么一些实现类提供 a constructors not requiring the version number ,不允许用于子类,而它们的 constructor for subclasses确实需要它。由于只有子类可以覆盖方法,因此受此问题的影响。
如果您不打算将您的软件与旧版本的 ASM 库一起使用,只需使用与您当前的 ASM 库版本相对应的数字,即不带 EXPERIMENTAL 的最高版本。后缀。否则,我建议在开发和测试期间使用旧版本,这再次允许只使用最高的 ASM…该版本中存在的编号。
您可以使用最新的 ASM 库生成面向所有版本的类。这取决于您传递给 visit 的版本方法。这是 V1_8 适用于 Java 8 和 V11 对于 Java 11。这些常量的实际值与 the versions of the JVM specification 相同.

关于java - 如何将 Opcodes 中 ASM 的 API 版本映射到 Java 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63399682/

相关文章:

使用另一个注释的 Java 自定义注释

file - 检查.exe文件的文件版本(服务器端),以及是否有较新的下载文件

reactjs - 需要react-redux v6 v3.*.* 版本的react-redux-firebase

python - pyc 文件与 python 的次要版本无关吗?

java - 如何克服 JDK 7/8 应用程序的 "VerifyError:Expecting a stackmap frame"?

java - 在 Eclipse 中运行 AlgoTrader

java - 我应该为 MultipartEntity 设置 Content-Type header 吗?

java - 在运行时访问 OSGi 包中的 pom 属性

java - 如何使用ASM重写visitMethod将两个类合并为一个类

java - 使用 ASM 字节码检测在堆栈上加载构造函数参数(值)