2010-11-30 2 views
5

Я смотрю на какой-то Java кода, и я заметил следующее:Что означает ключевое слово jsr?

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

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

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

+2

Подобный вопрос без принятого ответа http://stackoverflow.com/questions/2135864/are-these-encoded-codes – HeDinges 2010-11-30 10:09:50

ответ

10

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

JSR 432 пахнет примечанием декомпилятора, где декомпилятор обнаружил «прыгающий» код, но не имеет понятия о том, как выразить его на языке Java.

+0

Это должно быть. Я на 90% уверен, что код, который я ищу, является декомпилированным кодом. Любой способ собрать вместе то, что здесь происходит? Или получает исходный источник единственным вариантом? – 2010-11-30 10:08:32

+1

@Mark - Трудно сказать. Вы можете попытаться исправить это вручную, но вам нужно разобрать байт-код для этого метода и попытаться выяснить, где алгоритм продолжается. 432 является индексом байтового кода. Я делал это в некоторых случаях, так что да, технически это возможно. – 2010-11-30 10:10:47

+0

Gotcha, спасибо! – 2010-11-30 10:11:46

3

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

EDIT

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

0

Это не в list of Java keywords. Поэтому я не верю, что это имеет какой-то смысл. И я сомневаюсь, что это можно скомпилировать.

1

JSR означает Java Specification Request.

Там, вероятно, опечатка в этом коде, и он должен был

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

Мне кажется, что кто-то сделал неработающего фиксирование по какой-то причине.

Но, смотря на этот код, он выглядит ужасно искусственным, поэтому, вероятно, это декомпилированный код, как уже указывал Andreas_D.

Mini обновление: проверьте нижний комментарий:

/* Location:   C:\Users\Matteo\Downloads\FreeDownApplet.signed.jar 
* Qualified Name:  FreeDownApplet 
* JD-Core Version: 0.5.4 
*/ 

От этого, я бы сказал, что кто-то сделало подписанный файл банки, который был обфусцированным, и тот, кто разместил этот код декомпилирован его.

Обновление 2: «Ядро JD» для googling дает http://java.decompiler.free.fr/ в качестве первого результата.

2

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

0

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

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

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

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

Смежные вопросы