Компиляция / разборка Java без создания постоянного пула? - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблемы с пониманием использования некоторых 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
...

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

1 Ответ

0 голосов
/ 16 апреля 2020

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

  • Объект веб-asm содержит служебный класс, который отключает предоставленный входной класс. Просто скачайте jar asm ( hotlink ) и jar asm-util , содержащий утилиту ( hotlink ). С обоими этими 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

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

  • Я думаю, Кракатау должно работать так же, но так как мне не понравился их синтаксис и python, я ' У меня никогда не было более глубокого взгляда на это.

...