Java 预处理器
2022-09-01 00:18:31
如果我有一个布尔字段,比如:
private static final boolean DEBUG = false;
在我的代码中,我有这样的语句:
if(DEBUG) System.err.println("err1");
Java预处理器是否只是摆脱了if语句和无法访问的代码?
如果我有一个布尔字段,比如:
private static final boolean DEBUG = false;
在我的代码中,我有这样的语句:
if(DEBUG) System.err.println("err1");
Java预处理器是否只是摆脱了if语句和无法访问的代码?
大多数编译器将消除该语句。例如:
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
是的,Java 编译器将消除由常量控制的块中的已编译代码。这是有条件地编译不希望包含在生产版本中的“调试”代码的可接受方法。if