如何用Scala(50.0 / 51.0)发布更新的类文件版本?

我想用scalac创建的类来测试新的类型检查字节码验证器。

scalac目前输出版本49.0的类文件,但是新的类型检查验证器仅在版本51.0以后才是必需的。

我试图用ProGuard(实际上已将其转换为版本50.0)对类进行“预校验”,但我不确定新的验证器是否会自动回退到旧的类型推理验证器。

如何将类文件转换为版本51.0(或者,如何在加载版本50.0的类文件时找出使用哪个验证器)?


看起来像FJBG(NSC用来生成字节码的库)在支持StackMap方面已经看到了一些努力,但我不知道它有多远。

如果你问斯卡拉内部,Stephane Michelou可能会弹出。 他是一直在努力的人。


我不确定,但我认为字节码格式并没有经过深刻的改变,它可能总是向后兼容。 (如果你知道关于字节码的一些东西,请记住long和double在常量池和操作数堆栈中的双打,这些设计有点疯狂。它没有被修改,是吗?)因此,更改主要/次要编号可能会起作用。

怎么做? 有两种方法:

  • 使用hexa编辑器并手动修改它。 如果知道字节的位置,它应该非常简单。 它有[字节码规范] [1],它说,你应该跳过前四个字节,你会看到两个字节的小版本和两个字节的主版本(按此顺序)。
  • 使用库。 我有一些BCEL的经验。 它似乎不是我见过的最好设计的图书馆,但它应该足够适合你的情况。 我在类中看到了setMinor和setMajor方法(请看ClassGen和“几乎不可变的”JavaClass)。
  • [1] http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html


    我会使用ASM来解析字节码。 我知道scala(和clojure)在内部使用ASM,所以花在学习上的努力不会被浪费。 您可以将一个ClassReader和一个EmptyVisitor放在一起,以覆盖可快速提供标题信息的访问方法。

    链接地址: http://www.djcxy.com/p/41781.html

    上一篇: How to emit newer class file versions with Scala (50.0/51.0)?

    下一篇: What's the best way to use web services in python?