Компиляция/разборка Java без создания постоянного пула?

У меня возникли проблемы с пониманием использования некоторых инструкций байт-кода Java, частично из-за отсутствия примеров. Вместо этого я использую javac или Jasmin для компиляции обычного Java-кода, а затем использую javap -c для проверки сгенерированного байт-кода.

Мой проект построен на платформе, которая оптимизирует для меня мой байт-код, поэтому моему собственному генератору кода не нужно управлять пулом констант за меня. Поскольку вывод javap содержит много ссылок на пул констант, это не совсем проясняет использование, если мне не нужно использовать эти ссылки самому.

Есть ли способ получить дизассемблированный байт-код без таблицы символов (или каких-либо ссылок на нее)?

Чтобы уточнить, предположим, что у нас есть следующий код:

public class MyConcatCode {
    public static void main(String[] args){
        String a ="Hello ";
        String b ="World!";
        String c = new StringBuilder().append(a).append(b).toString();
    }
}   

Это решает:

...
       0: ldc           #7                  // String Hello
       2: astore_1
       3: ldc           #9                  // String World!
       5: astore_2
       6: new           #11                 // class java/lang/StringBuilder
       9: dup
      10: invokespecial #13                 // Method java/lang/StringBuilder."<init>":()V
      13: aload_1
      14: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      17: aload_2
      18: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: invokevirtual #18                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      24: astore_3
      25: return
...

Но я бы предпочел следующее:

...
       0: ldc Hello
       2: astore_1
       3: ldc World!
       5: astore_2
       6: new java/lang/StringBuilder
       9: dup
      10: invokespecial java/lang/StringBuilder."<init>":()V
      13: aload_1
      14: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      17: aload_2
      18: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
      24: astore_3
      25: return
...

Если компилятор, как и предоставленный мне фреймворк, создаст пул констант после создания байт-кода, описанного в моем втором примере, то должна быть возможность получить байт-код, который вообще не содержит таблицы символов, верно?


person thedjdoorn    schedule 10.04.2020    source источник
comment
Я не совсем понимаю, в чем ваш вопрос. Запрос кода Java, который не использует пул констант (который не будет существовать в реальной жизни, поскольку многие инструкции байт-кода Java по своей сути ссылаются на пул констант) или запрос дизассемблера, который оставляет ссылки на пул констант в качестве числовой константы. индекс пула вместо символического имени?   -  person Ralf Kleberhoff    schedule 10.04.2020
comment
Если я вас правильно понимаю, вы ищете средство просмотра Java ByteCode, которое автоматически разрешает константы из пула констант.   -  person Robert    schedule 10.04.2020
comment
Запустите фильтр регулярных выражений по выходным данным, который удалит вхождения #\d+\s*// \w+?   -  person Holger    schedule 14.04.2020


Ответы (1)


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

  • Object web asm содержит служебный класс, который разбирает предоставленный входной класс. Просто загрузите банку asm (горячая ссылка) и asm-util jar, содержащий утилиту (горячая ссылка). С обоими этими jar-файлами в пути к классам запустите класс org.objectweb.asm.util.Textifier и укажите путь к файлу класса, который вы хотите разобрать.
    java -jar -cp asm-8.0.1.jar:asm-util-8.0.1.jar org.objectweb.asm.util.Textifier /path/to/your/file.class

  • Просмотрщик байт-кода — мощный инструмент для работы с байт-кодом, в меню просмотра можно выбрать опцию «Байт-код». Их представительство разрешает ссылки для вас.

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

person Aki    schedule 16.04.2020