У меня возникли проблемы с пониманием использования некоторых инструкций байт-кода 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
...
Если компилятор, как и предоставленный мне фреймворк, создаст пул констант после создания байт-кода, описанного в моем втором примере, то должна быть возможность получить байт-код, который вообще не содержит таблицы символов, верно?
#\d+\s*// \w+
? - person Holger   schedule 14.04.2020