Java字节码 - 每个语句的一个标签

时间:2018-04-28 15:58:24

标签: java bytecode jvm-bytecode

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
}

1 个答案:

答案 0 :(得分:1)

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

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

  1. 使用IntelliJ
  2. 打开项目
  3. 右键单击左侧项目的根文件夹&#34; Project&#34;窗格中。
  4. 点击&#34;重新格式代码&#34;好的
  5. Reformat Code