Java 预处理器

2022-09-01 00:18:31

如果我有一个布尔字段,比如:

private static final boolean DEBUG = false;

在我的代码中,我有这样的语句:

if(DEBUG) System.err.println("err1");

Java预处理器是否只是摆脱了if语句和无法访问的代码?


答案 1

大多数编译器将消除该语句。例如:

public class Test {

    private static final boolean DEBUG = false;

    public static void main(String... args) {
        if (DEBUG) {
            System.out.println("Here I am");
        }
    }

}

编译完这个类后,我通过以下命令打印生成的指令列表:javap

javap -c Test
    Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."":()V
       4:   return

    public static void main(java.lang.String[]);
      Code:
       0:   return

    }

如您所见,不!:)System.out.println


答案 2

是的,Java 编译器将消除由常量控制的块中的已编译代码。这是有条件地编译不希望包含在生产版本中的“调试”代码的可接受方法。if


推荐