Код байта к исходному коду Java

Существуют незначительные различия, если Вы, оказывается, объявляете больше чем одну переменную в том же объявлении:

int[] a, b;  // Both a and b are arrays of type int
int c[], d;  // WARNING: c is an array, but d is just a regular int

Примечание, что это - плохой стиль кодирования, хотя компилятор почти наверняка зафиксирует Вашу ошибку момент, Вы пытаетесь использовать d.

22
задан Lii 9 February 2018 в 16:46
поделиться

5 ответов

Возможно. Для этого вам понадобится декомпилятор Java.

Вы обнаружите, что в основном он справится с задачей на удивление хорошо. Вы получите действительный файл .java , который будет компилироваться в файл .class , но этот файл .java не обязательно будет таким же, как оригинальный исходный код. Такие вещи, как циклические конструкции, могут выглядеть по-другому, и все, что только время компиляции, например универсальные шаблоны и аннотации, не будет воссоздано.

У вас может возникнуть проблема, если код был обфусцирован . Это процесс, который изменяет файлы классов, чтобы их было трудно декомпилировать. Например, имена классов и переменных изменены, чтобы все они были похожими, поэтому вы получите код вроде aa.a (ab) вместо employee.setName (name) , и это очень сложно понять, что происходит.

Я помню, как использовал JAD для этого, но не думаю, что это активно поддерживается, поэтому он может не работать с никогда не работающими версиями Java. Поиск в Google декомпилятора Java предоставит вам множество вариантов.

Я получу код вроде aa.a (ab) вместо employee.setName (name) , и очень сложно понять, что происходит.

Я помню, как использовал JAD , но я не думаю, что это активно поддерживается, поэтому он может не работать с никогда-версиями Java. Поиск в Google декомпилятора Java предоставит вам множество вариантов.

Я получу код вроде aa.a (ab) вместо employee.setName (name) , и очень сложно понять, что происходит.

Я помню, как использовал JAD , но я не думаю, что это активно поддерживается, поэтому он может не работать с никогда-версиями Java. Поиск в Google декомпилятора Java предоставит вам множество вариантов.

21
ответ дан 29 November 2019 в 05:31
поделиться

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

2
ответ дан 29 November 2019 в 05:31
поделиться

Не совсем декомпилятор, но JDK содержит javap, дизассемблер :

javap -c org.example.MyClass

В зависимости от вашего сценария использования, это может быть интересно узнать или использовать.

Обратите внимание, что результаты декомпиляции файла класса зависят от информации, содержащейся в файле класса. Если я правильно помню, включенная отладочная информация ( см. Флаг -g javac ) важна, особенно для именования переменных и т.п.

0
ответ дан 29 November 2019 в 05:31
поделиться

Это всегда возможно. Найдите "java disassembler".

Но комментарии к исходному коду и временные переменные будут недоступны.

Если вы декомпилируете класс и увидите, что код слишком сложен с именами переменных, а имена методов похожи на a, b, c ... это означает, что проект запутан.

0
ответ дан 29 November 2019 в 05:31
поделиться

DJ - простой в использовании декомпилятор Java . Просто откройте любой файл .class, и он покажет вам его код java .

Кроме того, вы можете использовать плагин jadClipse для eclipse, чтобы напрямую декомпилировать .class в .java

] А как насчет правильности кода, извлеченного из этой опции?
В любом случае код, который будет сгенерирован любым декомпилятором java, не будет таким же, как он был написан в исходном классе java. Поскольку он просто декодирует байт-код в Java-код. Единственное, в чем вы можете быть уверены, это то, что результат будет таким же, как и исходный код Java.

0
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: