Операторы Goto в декомпилированном коде вызывают проблемы - PullRequest
5 голосов
/ 07 октября 2011

Заказчик дал мне какой-то древний неподдерживаемый код стороннего поставщика в jar-файле, и я пытаюсь его перепроектировать, чтобы заново реализовать тот же протокол, который использовался для подключения к серверу.

Я декомпилировал его, и в одном из классов, похоже, есть метки и операторы goto.Мой компилятор выбрасывает это, потому что, насколько я понимаю, goto не поддерживается в Java.

Я не могу опубликовать весь код из-за проблем с IP, но вот суть (яЯ добавил ошибки компилятора в комментарии):

   private void methodName(InputType input)
        throws ConfigurationException
    {
    // initialization code here
_L2:
    String x; // The compiler is complaining that "String cannot be resolved to a variable" here
    String y; // This line is fine though...
    // Some Code here

    x = <SOME VALUE> // Compiler complains about "x cannot be resolved to a variable" 
    y = <ANOTHER VALUE> // Compiler is fine with this.

    // Some more code
    if(true) goto _L2; else goto _L1 // Multiple issues here see following lines.
    // Syntax error on token "goto", throw expected
    // _L2 cannot be resolved to a variable
    // Syntax error on token "goto", { expected
    // Syntax error on token "goto", { expected

_L1: // Syntax error on token "goto", { expected
        local; // local cannot be resolved to a variable

        // Some more code

         JVM INSTR ret 12; // Multiple issues here see following lines.
         //  JVM INSTR ret 12;
         // Syntax error on token "ret", = expected

         return;
    }

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

В строке с символом goto проверяется true , поэтому я могу просто удалить метки, поскольку они здесь неактуальны, но я не понимаю, что означает эта строка:

local;

Или это:

JVM INSTR ret 12;

Любая помощь, интерпретирующая это, будет наиболее ценной.

Ответы [ 3 ]

6 голосов
/ 07 октября 2011

То, что вы видите, это артефакты байт-кода, которые ваш декомпилятор не смог правильно обработать, как кажется. Для примера

_L2:
    String x;
    String y;

    ... 

    if(true) goto _L2; else goto _L1;
_L1:

могло бы быть что-то вроде

do {
    String x;
    String y; 

    ...

} while (true);

но декомпилятор не смог (или не попытался) собрать эти части должным образом. Аналогично,

JVM INSTR ret 12

представляется рендерингом для некоторого кода операции, который декомпилятор неправильно понял. Я понятия не имею, что может быть local.

4 голосов
/ 07 октября 2011

Какой декомпилятор вы используете?Попробуйте другой, это может привести к лучшему коду.У меня был довольно хороший опыт работы с JD-GUI .За исключением этого, посмотрите на байт-код.

2 голосов
/ 07 октября 2011

Если честно, с такими проблемами вам может быть лучше взглянуть на байт-коды напрямую. Попробуйте javap -c в файле класса и посмотрите, что на самом деле происходит внутри этого метода.

...