如何将操作码中ASM的API版本映射到Java版本?

问题描述

ASMClassVisitor构造函数需要传递OpcodesASM4ASM5ASM6ASM7中的一个ASM8ASM9

如何知道每个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 类文件格式版本。