5

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

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

javac 对此感到窒息,说这不是一个语句,并且在关键字之后需要一个分号jsr

我做了一些谷歌搜索,发现了一些包含相同内容的代码,这让我相信它是故意存在的(即使他们也无法编译它)。那么做jsr什么呢?如何获得包含它的代码进行编译?

4

6 回答 6

10

我很确定这段代码来自 Java 反编译器。

闻起来像反编译器注释,反编译器在JSR 432其中找到了“跳转”代码,但不知道如何用 Java 语言表达它。

于 2010-11-30T10:05:39.123 回答
3

您很可能正在查看反编译某些反编译器无法处理的代码的结果。JSR是跳转子程序字节码的助记词;请参阅此页面以获取列表。所以jsr 432可能意味着在字节码地址调用私有方法432。但是,反编译器无法确定这一点,因此该方法可能是合成的,或者正在发生其他事情。

编辑

您在 Google 上找到的示例肯定是反编译器输出,看起来带有 JSR 的部分要么是由混淆、字节码修改/生成,要么是由反编译器填充造成的。

于 2010-11-30T10:06:49.360 回答
3

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

于 2010-11-30T10:20:38.153 回答
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 核心”产生http://java.decompiler.free.fr/作为第一个结果。

于 2010-11-30T10:08:13.163 回答
0

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

简要描述;简介

紧跟在这条 jsr 指令之后的指令操作码的 地址作为returnAddress类型的值被压入操作数堆栈。

这可以在JVM book 2nd edition中找到。

于 2010-11-30T10:24:13.880 回答
0

它不在Java 关键字列表中。所以我不相信它有任何意义。而且我怀疑是否可以编译它。

于 2010-11-30T10:07:26.260 回答