Что означает ключевое слово jsr? - PullRequest
5 голосов
/ 30 ноября 2010

Я смотрю на некоторый код Java и заметил следующее:

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

Джавак задыхается, говоря, что это не утверждение, и что после ключевого слова jsr.

ожидается точка с запятой.

Я немного погуглил и обнаружил некоторый код, содержащий то же самое , что заставляет меня поверить, что оно там намеренно (даже если они не смогли его скомпилировать). Так что же делает jsr? Как получить код, содержащий его для компиляции?

Ответы [ 6 ]

10 голосов
/ 30 ноября 2010

Я почти уверен, что этот код исходит из декомпилятора Java.

JSR 432 пахнет как примечание декомпилятора, где декомпилятор нашел код перехода, но не имеет понятия о том, как выразить его на языке Java.

3 голосов
/ 30 ноября 2010

Скорее всего, вы смотрите на результаты декомпиляции некоторого кода, с которым декомпилятор не смог справиться. JSR - мнемоника для байт-кода подпрограммы перехода; см эту страницу для списка. Так что jsr 432 может означать вызов частного метода по адресу байтового кода 432. Однако декомпилятор не может этого понять, поэтому, возможно, метод является синтетическим или что-то еще происходит.

EDIT

Пример Google, который вы нашли, определенно является выводом декомпилятора, и похоже, что часть с JSR вызвана либо обфускацией, модификацией / генерацией байтового кода, либо наполнением декомпилятора.

2 голосов
/ 30 ноября 2010

jsr 433 не является допустимым оператором Java. Это инструкция виртуальной машины, которая означает «Перейти к подпрограмме» (см. VM Spec для получения дополнительной информации). Декомпилятор вставил его, потому что он не понимал инструкцию байт-кода (возможно, он был запутан) и поэтому не мог декомпилировать его в действительный источник Java.

1 голос
/ 30 ноября 2010

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 : поиск в Google "JD core" дает http://java.decompiler.free.fr/ в качестве первого результата.

0 голосов
/ 30 ноября 2010

JSR (что означает подпрограмма Jump) является частью спецификации виртуальной машины Java. Это набор инструкций для JVM.

Краткое описание

Адрес кода операции инструкция сразу после этого Инструкция JSR помещается на стек операндов как значение типа returnAddress .

Это можно найти в книге JVM, 2-е издание .

0 голосов
/ 30 ноября 2010

Его нет в списке ключевых слов Java .Поэтому я не верю, что это имеет какое-то значение.И я сомневаюсь, что это можно скомпилировать.

...