#java #bytecode #javap
#java #байт-код #javap
Вопрос:
У меня есть файл Java, который выглядит следующим образом:
package answers;
class finalRed{
private long l;
public synchronized void increment(){
l ;
}
public void decrement(){
synchronized(this){
l--;
};
}
}
И мне нужно просмотреть байт-код каждого из методов, и я знаю, что я должен использовать команду javap. Мне нужен такой вывод:
public synchronized void increment();
Code:
0: aload_0
1: dup
2: getfield #2 // Field l:J
5: lconst_1
6: ladd
7: putfield #2 // Field l:J
10: return
public void decrement();
Code:
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: aload_0
5: dup
6: getfield #2
9: lconst_1
10: lsub
11: putfield #2
14: aload_1
15: monitorexit
16: goto 24
19: astore_2
20: aload_1
21: monitorexit
22: aload_2
23: athrow
24: return
Однако запуск javap -c C:UsersAskGitITUProjPCPP-private-Garseweek01codeanswersfinalRed.class
(который я могу прочитать, должен работать) выдает мне этот результат:
Compiled from "finalRed.java"
public class answers.finalRed {
public answers.finalRed();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
}
Который на самом деле не показывает мне никакого кода из двух методов. Запуск javap с помощью -v или -verbose также не помогает. Как я должен запустить команду, чтобы получить фактический байт-код двух методов в классе?
Моя версия Java — 12.01
Комментарии:
1. Используйте
-v
флаг.2. sscce.org Является ли ваш фактический метод частным? Вам нужен
-private
флаг?3. Я не могу воспроизвести это (Java 15.0.1), использование javap -c <путь к классу> показывает мне (приблизительно) ваш ожидаемый результат. Какова ваша точная версия javac? Как вы это скомпилировали?
4. Выходные данные не совпадают. Ваш исходный код показывает непубличный класс, а вывод javap показывает общедоступный класс. Возможно, есть еще больше несоответствий, поэтому я бы последовал предположению @Brett Kail. Используйте
-p
или-private
для отображения закрытых членов.5. Даже если я повторюсь: выходные данные не совпадают . Файл класса не был скомпилирован из версии исходного кода, которую вы опубликовали.