3

编译器将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
}
4

1 回答 1

1

对我来说最简单的方法是使用代码编辑器打开项目并在编译之前格式化整个项目。这将确保所有语句都在自己的行上(因为通用代码风格要求每行一个语句)。

我将为您提供使用 IntelliJ IDEA 的方法(其中社区版是免费的)

  1. 使用 IntelliJ 打开项目
  2. 右键单击左侧“项目”窗格中项目的根文件夹。
  3. 点击“重新格式化代码”然后确定

重新格式化代码

于 2018-04-29T10:53:16.590 回答