Java字节码——每条语句一个标签

标签 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
}

最佳答案

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

我会告诉你如何使用 IntelliJ IDEA(其中的社区版是免费的)

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

Reformat Code

关于Java字节码——每条语句一个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078405/

相关文章:

java - 使用 livedata 的 Recyclerview 在数据更改后不会更新。仅在我旋转屏幕后

java - 突出显示方括号内的文本(正则表达式?)Android kotlin

java - Cascade ALL 未按预期工作

Python字节码和.pyc文件格式规范

java - 为什么 *const_n JVM 指令只定义了这样的常量范围?

java - 为什么在 Java 字节码中跳转而不是返回?

javascript - org.springframework.http.converter.HttpMessageNotReadableException : Required request body is missing 问题

java - 避免 getfield 操作码

java - 通过 ASM 跟踪方法依赖关系

java - 构造器字节码