我正在查看一些Java代码,我注意到以下内容:
if (!foo(bar, baz, qux)) {
i = 0; jsr 433;
}
javac嘲笑它,说这不是一个声明,并且在关键字jsr
之后预计会出现分号。
我做了一些谷歌搜索,我找到some code containing the same thing,这让我相信它是故意的(即使他们也无法编译)。那么jsr
做了什么?如何获得包含它的代码进行编译?
答案 0 :(得分:10)
我很接近这个代码来自Java反编译器。
JSR 432
闻起来像一个反编译注释,反编译器发现了一个“跳转”代码但没有关于如何用java语言表达它的线索。
答案 1 :(得分:3)
您很可能会查看反编译无法应对的某些代码的结果。 JSR是跳转子程序字节码的助记符;有关商家信息,请参阅this page。因此jsr 432
可能意味着在字节码地址432
调用私有方法。但是,反编译器无法解决这个问题,所以也许这个方法是合成的,或者其他的东西正在进行中。
修改强>
你发现的googled示例肯定是反编译器输出,看起来JSR的部分是由混淆,字节码修改/生成或反编译器填充引起的。
答案 2 :(得分:2)
jsr 433
不是有效的Java语句。它是一个VM指令,代表“跳转到子例程”(有关更多信息,请参阅VM Spec)。反编译器插入它是因为它不理解字节码指令(可能是它被混淆了),因此无法将其反编译成有效的Java源代码。
答案 3 :(得分:1)
JSR代表Java Specification Request。
该代码中可能存在拼写错误,应该是
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 :Google搜索“JD core”会产生http://java.decompiler.free.fr/作为第一个结果。
答案 4 :(得分:0)
它不在list of Java keywords中。所以我不相信它有任何意义。我怀疑是否可以编译它。
答案 5 :(得分:0)
JSR
(代表Jump Subroutine)是Java虚拟机规范的一部分。它是JVM的指令集。
简要说明
的操作码的地址 紧随其后的指示 jsr指令被推到了 操作数堆栈作为类型的值 returnAddress的
可以在JVM book 2nd edition上找到。