哪些Java编译器使用jsr指令,用于什么目的?

2022-09-02 12:59:02

Java 字节码语言具有 JSR 指令。

我用Java 7编译器编译的代码都没有使用这个指令。

但是,有时我下载的Java二进制文件确实会使用它,尽管很少。

我很想知道编译器使用该指令,以及哪些Java代码构造会导致他们使用它。

编辑这不是重复的,因为它指的是JSR字节码指令,而不是Java规范请求


答案 1

JSR 指令实际上甚至在 Java 7 类文件中都是不允许的。它只允许在 V49.0 或更早版本的类文件中使用,对应于 Java 5 或更早版本。在实践中,它早在那之前就已经不再使用了。

JSR/RET 机制最初用于实现最终的块。但是,他们认为节省代码大小不值得额外的复杂性,因此逐渐被淘汰。

我不知道确切的版本,因为我找不到任何那么旧的编译器,但根据我在网上找到的讨论,似乎过渡发生在Java 1.2-1.3时代,不同的编译器在不同的时间切换。我从未见过来自这些旧编译器之一的合法类文件,但你永远不知道它何时会发生。

在实践中,我在野外看到的JSR的唯一用途是用于混淆。例如,Zelix Klassmaster曾经使用它作为其字符串解密代码。我也在我自己的几个Java破解中使用它。


答案 2

根据 JVM 规范

在Java SE 6之前的Oracle实现Java编程语言编译器中,该指令与最终子句实现中的指令一起使用jsrret


推荐