发布于 2020-08-14 07:37:10
ASM…常量描述软件所需的最小ASM库版本。这对于兼容性至关重要,例如在Visitor中,因为当您重写旧版本中不存在的方法时,您不会注意到在针对旧版本进行链接时。这个方法永远不会被调用。
因此,使用ASM…常量可以更早地发现此类问题。这就是为什么有些实现类提供不需要版本号的构造函数。,而不允许子类使用,而它们的子类构造函数确实需要它。因为只有子类可以覆盖方法,因此,会受到此问题的影响。
如果您不打算将您的软件与较早版本的ASM库一起使用,只需使用与当前ASM库版本相对应的数字,即没有EXPERIMENTAL后缀的最高版本。否则,我建议在开发和测试期间使用旧版本,这再次允许只使用该版本中存在的最高ASM…数。
您可以使用最新的ASM库生成针对所有版本的类。这取决于要传递给visit方法的版本。这两种常量的实际值都与V1_8相同。
发布于 2020-08-13 17:15:42
据我所知,这并不容易,但ASM的变化有很大帮助。请注意,这些版本引用的是ASM版本,而不是类文件格式版本。
发布于 2022-04-28 17:13:00
您似乎需要指定支持任何类文件的API版本,因此,如果您所处的上下文使用的是未知的最新ASM,则可以通过反射字段搜索来指定它。
private static int ASM_VERSION = Opcodes.ASM5; // Default to first Java 8 version
static {
try {
for (int i = 6; true; i++) { // Loop for as many versions are available
Field asmField = org.objectweb.asm.Opcodes.class.getField("ASM" + i);
ASM_VERSION = asmField.getInt(null);
}
} catch (Throwable exception) {
}
}然后将其用作:
ClassVisitor cv = new ClassVisitor(ASM_VERSION)https://stackoverflow.com/questions/63399682
复制相似问题