Декомпилятор Java, который работает с Java 5 (обрабатывает перечисления среди других новых вещей) - PullRequest
8 голосов
/ 24 октября 2011

Я знаю, что этот вопрос уже задавался миллионы раз, но я специально искал декомпилятор, который бы обрабатывал перечисления (потому что jar, который я декомпилирую, интенсивно использует перечисления). Я проверял, что JAD и JD-GUI этого не делают.

Может ли кто-нибудь порекомендовать декомпилятор (в идеале, который работает под Linux и может легко обрабатывать весь jar, не требуя от меня написания сценариев оболочки)?

EDIT: В частности, у меня есть проблемы с конструкциями, такими как:

switch(myEnum) {
case A: ...
case B: ...
}

они декомпилируются (как для JAD, так и для JD-GUI) как что-то вроде:

switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) {
case 1:
case 2:
}

где $SWITCH_TABLE$com$MyType() либо вообще не объявлен, либо не компилируется.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2013

Я обнаружил, что продукт исследовательского проекта CFR особенно хорошо справляется с Enums.

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

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

Невозможно правильно декомпилировать переключатель enum. Файл java-classfile не знает о enum-Typ после компиляции, поэтому ваш декомпилятор не может декомпилировать его так, как вам нравится.

Типы перечислений являются подтипами java.lang.Enum, каждая константа перечисления получает порядковый номер, который используется в операторе switch. Компилятор делает переключение на этом int-значении, переключение на тип enum просто называется синтаксическим сахаром. Если вы попытаетесь включить null -enum, вы получите NPE.

...