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
}