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 (бесплатная версия для сообщества)

  1. Откройте проект с IntelliJ
  2. Щелкните правой кнопкой мыши корневую папку проекта на левой панели "Проект".
  3. Нажмите "Переформатировать код", затем ОК

Переформатировать код

Другие вопросы по тегам