如何解决如何将操作码中ASM的API版本映射到Java版本?
ASM的ClassVisitor
构造函数需要传递Opcodes
的ASM4
,ASM5
,ASM6
,ASM7
中的一个,ASM8
或ASM9
。
如何知道每个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 类文件格式版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。