jsr关键字是什么意思?

5

我正在查看一些Java代码,注意到以下内容:

if (!foo(bar, baz, qux)) {
    i = 0; jsr 433;
}

javac在此处出现错误,提示这不是一个语句,并且关键字jsr后面需要加上分号。

我进行了一些谷歌搜索,发现一些代码中也包含了相同的内容,这让我相信这是有意为之的(尽管他们也无法编译它)。那么jsr是什么?如何使包含它的代码编译通过呢?


2
没有被接受的答案的类似问题:http://stackoverflow.com/questions/2135864/are-these-encoded-codes - HeDinges
6个回答

10

我几乎可以确定这段代码来自于Java反编译器。

JSR 432 像是反编译器的注释,其中反编译器发现了一个"跳转"代码,但不知道如何在Java语言中表达它。


那一定是这样。我有90%的把握认为我正在查看反编译代码。有没有办法拼凑出这里原本想要发生什么?或者获取原始源代码是唯一的选择吗? - user113292
1
@Mark - 很难说。你可以尝试手动更正,但需要反汇编该方法的字节码,并尝试找出算法继续的位置。432是一个字节码索引。我在某些情况下做过这件事,所以从技术上讲,这是可能的。 - Andreas Dolk
3
请参见此处:http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc7.html#jsr - clstrfsck
@spong,我刚刚在回答中添加了你的链接,现在才看到它。 - Buhake Sindi

3
您很可能正在查看某些反编译代码的结果,而反编译器无法处理其中的部分。JSR是跳转子程序字节码的助记符;请参见此页面以获取列表。因此,jsr 432可能意味着在字节码地址432处调用私有方法。但是,反编译器无法弄清楚这一点,因此该方法可能是合成的,或者其他情况发生了变化。

编辑

您找到的示例经过谷歌搜索后发现确实是反编译器的输出,而JSR部分可能是由混淆、字节码修改/生成或反编译器错误引起的。


3

jsr 433不是一个有效的Java语句。它是一个VM指令,代表“跳转到子程序”(更多信息请参见VM规范)。反编译器将其插入,因为它无法理解字节码指令(可能被混淆),因此无法将其反编译为有效的Java源代码。


javac 仅用于发出 finally 块的 jsr 指令。 我认为它现在甚至不再这样做了。 - Tom Hawtin - tackline

1

JSR代表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/ 是第一个结果。


没错,这只是我在谷歌上找到的一个例子,但我很确定我个人正在查看的是反编译代码。有意思。 - user113292

0

它不在Java关键字列表中。因此我不相信它有任何意义。而且我怀疑它是否能够编译。


0

JSR(Jump Subroutine)是Java虚拟机规范的一部分,它是JVM的指令集。

简要描述

紧接着这个jsr指令的操作码的地址将作为类型为returnAddress的值推送到操作数栈上。

此内容可在JVM第二版中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接