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

paj*_*j28 16 java bytecode

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

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

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

我有兴趣知道编译器使用什么指令,以及Java代码构造会导致它们使用它.

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

Ant*_*ony 16

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

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

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

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

  • 当我在使用IBM AS/400类文件验证程序时,我讨厌使用`jsr`进行混淆的代码,因为它需要无限复杂(以及缓慢和存储占用)来验证.(并且使用从混淆代码中窃取的技术,我编写了BigUglyMethod,这是一个类文件,它通过将它绑在一起打破了Sun的验证程序.但是我们的当然用鲜艳的颜色来处理它.) (3认同)
  • @Hot Licks是的验证令人讨厌.我不得不多次阅读Hotspot源代码来弄清楚jsrs实际上是如何被验证的,因为规范是如此模糊.从好的方面来说,我还在验证器中发现了各种很酷的无证技巧.例如,我构建了一个验证方法很好的方法,但由于验证程序代码的三个不同部分之间的微妙交互,简单地重新排列if语句的分支会导致验证失败. (3认同)

ass*_*ias 6

根据JVM规范:

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

  • 这与查看负责字节码生成的OpenJDK源的搜索是一致的:它出现在`try`块的字节码生成中,其中存在`finally`. (3认同)