Java-байт-код - одна метка для каждого оператора
javac
Компилятор добавляет метку номера строки к каждой инструкции, которая соответствует новой строке в исходном коде. Как следствие, когда несколько операторов перечислены в одной строке, они все попадают под одну и ту же метку строки (L1
в случае, показанном ниже, с двумя операторами печати в одной строке).
Возможно ли, чтобы компилятор выводил одну метку на оператор? Я хотел бы сгруппировать инструкции по операторам (а не по строкам) для задачи анализа байт-кода.
Исходный код
package com.example;
public class Foo {
public void bar() {
System.out.println("test");
System.out.println("test"); System.out.println("test");
}
}
Bytecode
(Скомпилировано с Oracle JDK 8, выходные данные отладки включены)
// class version 52.0 (52)
// access flags 0x21
public class com/example/Foo {
// compiled from: Foo.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom/example/Foo; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public bar()V
L0
LINENUMBER 5 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "test"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
LINENUMBER 6 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "test"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "test"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L2
LINENUMBER 7 L2
RETURN
L3
LOCALVARIABLE this Lcom/example/Foo; L0 L3 0
MAXSTACK = 2
MAXLOCALS = 1
}
1 ответ
Самый простой способ для меня - открыть проект с помощью редактора кода и отформатировать весь проект перед его компиляцией. Это будет гарантировать, что все операторы находятся на отдельной строке (так как общий стиль кода требует одного оператора на строку).
Я дам вам способ использовать IntelliJ IDEA (бесплатная версия для сообщества)
- Откройте проект с IntelliJ
- Щелкните правой кнопкой мыши корневую папку проекта на левой панели "Проект".
- Нажмите "Переформатировать код", затем ОК