У меня проблемы с пониманием использования некоторых 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
...
Если, как и предоставленная мне среда, компилятор создает пул констант после создания байт-кода, описанного во втором примере, тогда это должно быть можно получить байт-код, который вообще не содержит таблицы символов, верно?