Байт-код Java - одна метка для каждого оператора

Компилятор javac добавляет метку номера строки к каждой инструкции, которая соответствует новой строке в исходном коде. Как следствие, когда в одной строке перечислены несколько операторов, все они попадают под одну и ту же метку строки (L1 в случае, показанном ниже, с двумя операторами печати в одной строке).

Возможно ли, чтобы компилятор выводил одну метку на инструкцию? Я хотел бы сгруппировать инструкции по операторам (а не по строкам) для задачи анализа байт-кода.

Исходный код

package com.example;

public class Foo {
    public void bar() {
        System.out.println("test");
        System.out.println("test"); System.out.println("test");
    }
}

Байт-код

(Скомпилировано с 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
}

person gandreadis    schedule 28.04.2018    source источник
comment
Можно ли заранее отформатировать код?   -  person Yassin Hajaj    schedule 28.04.2018
comment
Я думаю, что вам лучше всего отформатировать код, как предложил Ясин. В противном случае это вопрос модификации Javac, что гораздо сложнее.   -  person Antimony    schedule 28.04.2018
comment
Не идеальный, но действительно, вероятно, мой лучший вариант. @YassinHajaj не стесняйтесь формулировать ответ на вопрос, я был бы рад принять его.   -  person gandreadis    schedule 29.04.2018
comment
@gandreadis Хорошо, я дам ответ, например, с IntelliJ   -  person Yassin Hajaj    schedule 29.04.2018


Ответы (1)


Самый простой способ для меня — открыть проект в редакторе кода и отформатировать весь проект перед его компиляцией. Это гарантирует, что все операторы находятся на отдельной строке (поскольку общий стиль кода предписывает один оператор в строке).

Я дам вам способ использовать IntelliJ IDEA (версия для сообщества бесплатна)

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

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

person Yassin Hajaj    schedule 29.04.2018