我正在查看一些 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是跳转子程序字节码的助记词;请参阅此页面以获取列表。所以jsr 432
可能意味着在字节码地址调用私有方法432
。但是,反编译器无法确定这一点,因此该方法可能是合成的,或者正在发生其他事情。
编辑
您在 Google 上找到的示例肯定是反编译器输出,看起来带有 JSR 的部分要么是由混淆、字节码修改/生成,要么是由反编译器填充造成的。
jsr 433
不是有效的 Java 语句。这是一个 VM 指令,代表“跳转到子例程”(有关更多信息,请参阅VM 规范)。反编译器插入它是因为它不理解字节码指令(可能它被混淆了),因此无法将它反编译成有效的 Java 源代码。
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/作为第一个结果。
JSR
(代表 Jump Subroutine)是 Java 虚拟机规范的一部分。它是 JVM 的指令集。
简要描述;简介
紧跟在这条 jsr 指令之后的指令操作码的 地址作为returnAddress类型的值被压入操作数堆栈。
这可以在JVM book 2nd edition中找到。
它不在Java 关键字列表中。所以我不相信它有任何意义。而且我怀疑是否可以编译它。