Java预处理器

two*_*e18 45 java optimization preprocessor

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

private static final boolean DEBUG = false;

在我的代码中我有如下声明:

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

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

Ada*_*ter 115

大多数编译器都会删除该语句.例如:

public class Test {

    private static final boolean DEBUG = false;

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

}
Run Code Online (Sandbox Code Playgroud)

编译完这个类后,我会通过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!:)

  • 关于如何自己测试的说明+1. (18认同)
  • 另外,当你有一个类似于`if(DEBUG && condition_that_may_be_true)......的语句时,我检查过,如果`DEBUG`总是为假,它会将其删除. (2认同)

Gre*_*ill 13

是的,Java编译器将消除if由常量控制的块中的编译代码.这是有条件地编译您不希望包含在生成构建中的"调试"代码的可接受方法.

  • @Ralph:有关JLS中的讨论,请参阅[14.21无法访问的语句](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21).关于`if`语句的位置就在该部分的末尾附近. (3认同)