首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Opcode中的ASM API版本映射到Java版本?

如何将Opcode中的ASM API版本映射到Java版本?
EN

Stack Overflow用户
提问于 2020-08-13 16:45:14
回答 3查看 1.3K关注 0票数 6

ASMClassVisitor构造函数需要传递OpcodesASM4ASM5ASM6ASM7ASM8ASM9之一。

我如何知道在每个版本的Java中使用哪个ASM#?我将为Java8使用什么ASM#?我将为Java11使用什么ASM#

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-14 07:37:10

ASM…常量描述软件所需的最小ASM库版本。这对于兼容性至关重要,例如在Visitor中,因为当您重写旧版本中不存在的方法时,您不会注意到在针对旧版本进行链接时。这个方法永远不会被调用。

因此,使用ASM…常量可以更早地发现此类问题。这就是为什么有些实现类提供不需要版本号的构造函数。,而不允许子类使用,而它们的子类构造函数确实需要它。因为只有子类可以覆盖方法,因此,会受到此问题的影响。

如果您不打算将您的软件与较早版本的ASM库一起使用,只需使用与当前ASM库版本相对应的数字,即没有EXPERIMENTAL后缀的最高版本。否则,我建议在开发和测试期间使用旧版本,这再次允许只使用该版本中存在的最高ASM…数。

您可以使用最新的ASM库生成针对所有版本的类。这取决于要传递给visit方法的版本。这两种常量的实际值都与V1_8相同。

票数 7
EN

Stack Overflow用户

发布于 2020-08-13 17:15:42

据我所知,这并不容易,但ASM的变化有很大帮助。请注意,这些版本引用的是ASM版本,而不是类文件格式版本。

票数 1
EN

Stack Overflow用户

发布于 2022-04-28 17:13:00

您似乎需要指定支持任何类文件的API版本,因此,如果您所处的上下文使用的是未知的最新ASM,则可以通过反射字段搜索来指定它。

代码语言:javascript
复制
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) {
    }
}

然后将其用作:

代码语言:javascript
复制
ClassVisitor cv = new ClassVisitor(ASM_VERSION)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63399682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档