什么Java编译器使用jsr指令,为什么?

时间:2014-01-15 23:04:02

标签: java bytecode

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

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

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

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

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

2 个答案:

答案 0 :(得分:15)

实际上,Java 7类文件中甚至不允许使用JSR指令。它仅允许在49.0或更早版本的类文件中,对应于Java 5或更早版本。在实践中,它在很久之前就已经不再使用了。

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

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

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

答案 1 :(得分:6)

根据JVM specification

  

在Oracle的Java SE 6之前的Java编程语言编译器的实现中,jsr指令与finally子句的实现中的ret指令一起使用