Байт-код Java - одна метка для каждого оператора - PullRequest
0 голосов
/ 28 апреля 2018

Компилятор 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 Ответ

0 голосов
/ 29 апреля 2018

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

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

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

Reformat Code

...