Компилировать или не компилировать файлы .class

Существует веб-приложение, которое запускается в Windows в браузере Tomcat. Приложение использует количество файлов .jar в качестве хранилища для своей логики.

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

Когда я передаю этот скомпилированный .class службе, такой как showmycode.com, я вижу фактический код Java. На этом этапе я изменяю код в соответствии со своими потребностями и хочу поместить обновленный файл .class для использования приложением (поместите его обратно в банку).

Обязательно ли мне компилировать файл .class в «получитаемую тарабарщину» или я могу поместить его туда как файл исходного кода (вероятно, нет, но я подумал, что на всякий случай спрошу). Если мне нужно скомпилировать код atered, могу ли я сделать это, не запуская проект в какой-либо Java IDE, и просто скомпилировать его в .class через командную строку или что-то в этом роде?


person Maxim V. Pavlov    schedule 08.11.2014    source источник
comment
Почему вы выполняете циклы декомпиляции-редактирования-перекомпиляции? Вы никогда не должны делать это. Просто работайте над исходным, задокументированным, незапутанным исходным кодом, и когда ваш код будет готов, скомпилируйте его. Таким образом, у вас всегда будет читаемый, документированный код.   -  person Benjamin Gruenbaum    schedule 08.11.2014
comment
Видя, что вы работаете с C #, то, что вы делаете, похоже на декомпиляцию .NET DLL / EXE, редактирование кода и последующую их перекомпиляцию. Это не имеет большого смысла в качестве рабочего процесса. Если вам нужно декомпилировать файл, сделайте это один раз, затем задокументируйте его, осмыслите и с этого момента всегда используйте исходный код .   -  person Benjamin Gruenbaum    schedule 08.11.2014
comment
Я изменяю приложение, к источникам которого у меня нет доступа.   -  person Maxim V. Pavlov    schedule 08.11.2014
comment
В большинстве случаев для этого все же лучше использовать отражение.   -  person Benjamin Gruenbaum    schedule 08.11.2014
comment
Я не понимаю, как просмотр источников (отражение в .Net) поможет мне изменить логику файла .jar.   -  person Maxim V. Pavlov    schedule 08.11.2014


Ответы (1)


Существует два основных метода редактирования приложения, для которого у вас нет исходного кода.

Первый, как вы обнаружили, это декомпиляция, редактирование, перекомпиляция. Преимущество в том, что вам не нужно ничего знать о байт-коде, поскольку он просто декомпилируется в Java. Главный недостаток заключается в том, что даже самые лучшие декомпиляторы не могут гарантировать получение перекомпилируемого кода. А если приложение вообще было обфусцировано, то о перекомпиляции можно забыть.

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

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

person Antimony    schedule 08.11.2014