Java-декомпилятор и редактор для быстрой модификации
Я пытаюсь найти Java-декомпилятор, такой же, как swf-decompiler, который позволяет редактировать и перекомпилировать исходный код, не экспортируя его куда-либо, и выполнять какие-либо внешние действия. Я хочу очень быстро применить небольшие изменения к.jars и сохранить их, не тратя дополнительное время на ручную перекомпиляцию кода Java с другими инструментами. Есть ли такой декомпилятор? Есть ли что-нибудь подобное (например, редактор переменных.class) и возможно ли вообще сделать декомпилятор Java, такой как swf-декомпилятор?
1 ответ
Рекомендация инструмента является оффтопом, но что касается вопроса о том, возможно ли это, ответ - да и нет.
Java относительно дружественна к декомпиляторам, поэтому для простых случаев должна быть возможность создать такой инструмент. Тем не менее, существуют некоторые функции или шаблоны, которые могут сбить с толку текущие декомпиляторы, и, учитывая сложность языка, вряд ли когда-либо найдется декомпилятор, который может надежно обойти произвольную Java.
Кроме того, хотя компиляция Java теряет намного меньше информации, чем C, она теряет информацию. Очевидно, что вы потеряете такие вещи, как комментарии и пробелы, но при настройках по умолчанию вы потеряете гораздо больше: имена локальных переменных, флаги и типы, универсальные типы, аннотации времени компиляции и т. Д. Большая часть этой информации сохраняется до в некоторой степени для целей отражения и передачи -g
Флаг компилятора может заставить его сохранить больше информации, но вы не можете получить все это обратно.
Короче говоря, вы можете делать разумную работу большую часть времени, но вы не можете делать это идеально все время.
Также обратите внимание, что это для обычной Java, скомпилированной самостоятельно. Если файлы классов изначально не были написаны на Java или они полностью запутаны, вы можете забыть перекомпилировать. Даже когда декомпиляторы выдают читаемый вывод, вряд ли он будет перекомпилирован.
Если вы хотите изменить произвольные файлы jar, вам нужен дизассемблер и ассемблер. Лучший из известных мне Кракатау (Раскрытие: я написал). Преимущество этого в том, что он будет работать для любых файлов классов, даже если они запутаны. Однако, это совсем не удобно для пользователя. Если вы не знаете, как обходиться с форматом файла классов и байт-кодом, вы не сможете вносить более чем простые изменения (например, изменять постоянную строку).