Java разобрать собрать - PullRequest
       28

Java разобрать собрать

4 голосов
/ 15 ноября 2010

Скажем, я хочу взять файл класса java, разобрать его, настроить вывод байт-кода java, а затем снова собрать его.

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

Есть ли ... простой способ сделать это? Я нашел несколько инструментов для разборки или повторной сборки, но не для обоих; или нет пар инструментов, которые, кажется, используют один и тот же формат для представления байт-кода в тексте.

Ответы [ 5 ]

6 голосов
/ 15 ноября 2010

Вы проверяли ASM API?

Вот пример кода (адаптированный из официальной документации), объясняющий, как изменить байт-код класса:

ClasssWriter cw = new ClassWriter();
ClassAdapter ca = new ClassAdapter(cw); // ca forwards all events to cw
// ca should modify the class data
ClassReader cr = new ClassReader("MyClass");
cr.accept(ca, 0);
byte[] b2 = cw.toByteArray(); // b2 represents the same class as MyClass, modified by ca

Затем b2 может быть сохранен в файле .class для будущего использования.Вы также можете использовать метод ClassLoader.defineClass(String,byte[],int,int), чтобы загрузить его, если определите свой собственный загрузчик классов.

5 голосов
/ 05 февраля 2011

Этот вопрос сейчас немного старше, но, поскольку я нигде не нашел ответа на этот вопрос в stackoverflow, позвольте мне записать его:

Это стандартная комбинация jasper / jasmin , которую я успешно использовал в прошлом:

  • яшма для разборки в формате, совместимом с жасмином
  • jasmin , который пересобирает вывод яшмы

Единственное неудобство, связанное с jasper, заключается в том, что он забывает создать метку для предложения switch по умолчанию, а затем jasmin выдаст вам ошибки, подобные

Main.j: 391: Метка ошибки JAS: LABEL0x48 не был добавлен в код.

Что означает, что вам нужно зайти в файл .j и исправить его вручную. "Javap-C" может помочь вам там. Для этой ошибки я бы предложил вам jasper и сразу jasmin перед любыми изменениями, просто чтобы убедиться, что это работает.

На самом деле вы можете исправить эту ошибку, применив этот патч к jasper:

--- Code_Collection.java.orig   1999-06-14 14:10:44.000000000 +0000
+++ Code_Collection.java        2011-02-05 07:23:21.000000000 +0000
@@ -1210,6 +1210,7 @@
     -----------------------------------------------------------------------*/
    void getLabel(Code_Collection code) {
       for (int i = 0; i < count; i++) code.setLabel(pc+branch[i]);
+      code.setLabel(pc+tableDefault);
    }

    /*-----------------------------------------------------------------------

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

Редактировать: Джаспер с примененным выше патчем теперь доступен на https://github.com/EugenDueck/Jasper

И еще есть Схема байт-кода Eclipse , как описано в этом ответе: редактор байт-кода Java?

2 голосов
/ 02 июля 2013

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

Единственный реальный недостаток Кракатау в том, что в настоящее время он не очень хорошо документирован.Но если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.(Раскрытие: я написал Кракатау).

0 голосов
/ 15 ноября 2010

Вы описываете, что уже делают современные компиляторы.В дополнение к этому большинство JVM могут (и пытаются) продолжать оптимизировать байт-код во время работы приложения.

Начните с изучения того, что делают существующие компиляторы / JVM с байтовым кодом.В лучшем случае вы можете улучшить оптимизатор JVM, что возможно, но с низкой вероятностью, и в любом случае вы можете заново изобретать колесо.В худшем случае ваши изменения фактически мешают оптимизатору времени выполнения и приводят к снижению общей производительности.

  1. Изучение компиляторов и JVM
  2. Тест
  3. Тест
  4. Бенчмарк

[ПРАВИТЬ] Найдена соответствующая запись: Шаблоны манипулирования байт-кодом

0 голосов
/ 15 ноября 2010

Не проще ли найти исходный код, изменить его, а затем перекомпилировать?Или это из какого-то двоичного кода, к которому у вас нет исходного кода?

Совет Pro: исходный код встроенной библиотеки классов Java доступен как часть проекта OpenJDK в частности в OpenJDK 6 Source .

...