早期(编译期)指的是通过javac编译器把java源码编译为class字节码的过程。

什么是条件编译?

一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。                                    ---百度百科

具体应用场景:

  1.     实现一个在 Linux和Windows上使用的程序,当程序在Linux上运行时,运行某一段代码,当程序在Windows上运行时,运行另一段代码。
  2.     实现一个区分 Debug 和 Release 模式的程序,即当程序用于Debug时,运行某一段代码,当程序用于 Release时,运行另一段代码。

Java编译器优化法则

  1. 对于条件表达式中永远为false的语句,编译器将不对条件覆盖的代码段生成字节码。
  2. 忽略未使用的变量。

下边举几个例子来说明条件编译。

例子1:

public static void main(String[] args) {
       if(true){
           System.out.println(true);
       }else {
           System.out.println(false);
       }
    }

用 DJ Java Decompiler 反编译为如下代码:

public static void main(String args[])
    {
        System.out.println(true);
    }

例子2:

public static void main(String[] args) {
       if(10>1){
           System.out.println(true);
       }else {
           System.out.println(false);
       }
    }

用 DJ Java Decompiler 反编译为如下代码:

public static void main(String args[])
    {
        System.out.println(true);
    }

例子3:

public static void main(String[] args) {
        int i=10;
       if(i>1){
           System.out.println(true);
       }else {
           System.out.println(false);
       }
    }

用 DJ Java Decompiler 反编译为如下代码:

public static void main(String args[])
    {
        int i = 10;
        if(i > 1)
            System.out.println(true);
        else
            System.out.println(false);
    }

例子4:


public static void main(String[] args) {
        final int i=10;
        final int j=20;
        int k=30;
       if(i>1){
           System.out.println(true);
       }else {
           System.out.println(false);
       }
    }

用 DJ Java Decompiler 反编译为如下代码:

public static void main(String args[])
    {
        int i = 10;
        int j = 20;
        int k = 30;
        System.out.println(true);
    }

由以上4个例子可以证明:对于条件表达式中永远为false的语句,编译器将不对条件覆盖的代码段生成字节码。

至于“忽略未使用的变量”这一条在例子4中不知道为什么反编译后的结果还存在没用到的变量j、k。我使用的是jdk1.8,反编译工具用的是DJ Java Decompiler,不知道和这个有关系没。知道的朋友可以在评论区留言,博主不胜感激。

条件编译应用

场景:实现一个区分DEBUG和RELEASE模式的程序。


通常为了让Java条件编译更加方便,我们创建一个类:CompilationConfig。

class CompilationConfig
 {
     static final boolean DEBUG_MODE = true;
     static final boolean RELEASE_MODE = false;
 }

从上面可以看出,这个类有如下特点:


  1.     全部都是static final boolean常量。
  2.     如果是debug模式,则DEBUG_MODE=true;
  3.     如果是release模式,则RELEASE_MODE=true;
public static void main(String[] args) {
        if(CompilationConfig.DEBUG_MODE)
        {
            System.out.println("[DEBUG MODE]You can print sth");
        }
        else
        {
            System.out.println("[RELEASE MODE]You can print sth");
        }
    }



如果DEBUG_MODE=true,则class文件编译后,用 DJ Java Decompiler 反编译为如下代码:

public static void main(String args[])
    {
        System.out.println("[DEBUG MODE]You can print sth");
    }