Java 字节码 - 每条语句一个标签
Java bytecode - one label for each statement
javac
编译器将行号标签添加到与源代码中的新行相对应的每条指令。因此,当在一行上列出多个语句时,它们都属于同一行标签(在下面显示的情况下,L1
,在同一行上有两个打印语句)。
是否可以让编译器为每条语句输出一个标签?对于字节码分析任务,我想按语句(而不是按行)对指令进行分组。
源代码
package com.example;
public class Foo {
public void bar() {
System.out.println("test");
System.out.println("test"); System.out.println("test");
}
}
字节码
(用Oracle JDK8编译,启用调试输出)
// 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
}
对我来说最简单的方法是使用代码编辑器打开项目并在编译之前格式化整个项目。这将确保所有语句都在自己的行上(因为通用代码风格要求每行一个语句)。
我会告诉你如何使用 IntelliJ IDEA(其中社区版是免费的)
- 用 IntelliJ 打开项目
- 右键单击左侧 "Project" 窗格中项目的根文件夹。
- 点击"Reformat Code"然后确定
javac
编译器将行号标签添加到与源代码中的新行相对应的每条指令。因此,当在一行上列出多个语句时,它们都属于同一行标签(在下面显示的情况下,L1
,在同一行上有两个打印语句)。
是否可以让编译器为每条语句输出一个标签?对于字节码分析任务,我想按语句(而不是按行)对指令进行分组。
源代码
package com.example;
public class Foo {
public void bar() {
System.out.println("test");
System.out.println("test"); System.out.println("test");
}
}
字节码
(用Oracle JDK8编译,启用调试输出)
// 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
}
对我来说最简单的方法是使用代码编辑器打开项目并在编译之前格式化整个项目。这将确保所有语句都在自己的行上(因为通用代码风格要求每行一个语句)。
我会告诉你如何使用 IntelliJ IDEA(其中社区版是免费的)
- 用 IntelliJ 打开项目
- 右键单击左侧 "Project" 窗格中项目的根文件夹。
- 点击"Reformat Code"然后确定