我正在查看一些Java代码,注意到以下内容:
if (!foo(bar, baz, qux)) {
i = 0; jsr 433;
}
javac在此处出现错误,提示这不是一个语句,并且关键字jsr
后面需要加上分号。
我进行了一些谷歌搜索,发现一些代码中也包含了相同的内容,这让我相信这是有意为之的(尽管他们也无法编译它)。那么jsr
是什么?如何使包含它的代码编译通过呢?
我正在查看一些Java代码,注意到以下内容:
if (!foo(bar, baz, qux)) {
i = 0; jsr 433;
}
javac在此处出现错误,提示这不是一个语句,并且关键字jsr
后面需要加上分号。
我进行了一些谷歌搜索,发现一些代码中也包含了相同的内容,这让我相信这是有意为之的(尽管他们也无法编译它)。那么jsr
是什么?如何使包含它的代码编译通过呢?
我几乎可以确定这段代码来自于Java反编译器。
JSR 432
像是反编译器的注释,其中反编译器发现了一个"跳转"代码,但不知道如何在Java语言中表达它。
jsr 432
可能意味着在字节码地址432
处调用私有方法。但是,反编译器无法弄清楚这一点,因此该方法可能是合成的,或者其他情况发生了变化。
编辑
您找到的示例经过谷歌搜索后发现确实是反编译器的输出,而JSR部分可能是由混淆、字节码修改/生成或反编译器错误引起的。
jsr 433
不是一个有效的Java语句。它是一个VM指令,代表“跳转到子程序”(更多信息请参见VM规范)。反编译器将其插入,因为它无法理解字节码指令(可能被混淆),因此无法将其反编译为有效的Java源代码。
javac
仅用于发出 finally
块的 jsr
指令。 我认为它现在甚至不再这样做了。 - Tom Hawtin - tacklineJSR代表Java规范请求。
那段代码可能有错别字,应该是
if (!foo(bar, baz, qux)) {
i = 0; //jsr 433;
}
我觉得有人出于某种原因进行了一个不起作用的签入检查。
但是,看着那段代码,它看起来非常人为,所以它很可能是反编译的代码,正如Andreas_D已经指出的那样。
小更新:请查看底部评论:
/* Location: C:\Users\Matteo\Downloads\FreeDownApplet.signed.jar
* Qualified Name: FreeDownApplet
* JD-Core Version: 0.5.4
*/
从这个来看,我想有人制作了一个混淆的签名 jar 文件,并且发布了该代码的人对其进行了反编译。
更新2:在谷歌搜索“JD core”时,http://java.decompiler.free.fr/ 是第一个结果。
JSR
(Jump Subroutine)是Java虚拟机规范的一部分,它是JVM的指令集。
简要描述
紧接着这个jsr指令的操作码的地址将作为类型为returnAddress的值推送到操作数栈上。
此内容可在JVM第二版中找到。