Что означает ключевое слово jsr?


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

if (!foo(bar, baz, qux)) {
    i = 0; jsr 433;
}
Javac давится этим, говоря, что это не оператор и что точка с запятой ожидается после ключевого слова jsr.

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

6 5
jsr

6 ответов:

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

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

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

EDIT

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

jsr 433 не является допустимым оператором Java. Это инструкция VM, которая расшифровывается как "перейти к подпрограмме" (смотрите VM Spec для получения дополнительной информации). Декомпилятор вставил его, потому что он не понимал инструкцию байт-кода (возможно, она была запутана) и поэтому не мог декомпилировать его в допустимый источник 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: погуглите "Джей Ди кор" дает http://java.decompiler.free.fr/ в качестве первого результата.

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

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

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

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

Это можно найти наJVM book 2nd edition .