早期(编译期)指的是通过javac编译器把java源码编译为class字节码的过程。
什么是条件编译?
一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。 ---百度百科
具体应用场景:
- 实现一个在 Linux和Windows上使用的程序,当程序在Linux上运行时,运行某一段代码,当程序在Windows上运行时,运行另一段代码。
- 实现一个区分 Debug 和 Release 模式的程序,即当程序用于Debug时,运行某一段代码,当程序用于 Release时,运行另一段代码。
Java编译器优化法则
- 对于条件表达式中永远为false的语句,编译器将不对条件覆盖的代码段生成字节码。
- 忽略未使用的变量。
下边举几个例子来说明条件编译。
例子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;
}
从上面可以看出,这个类有如下特点:
- 全部都是static final boolean常量。
- 如果是debug模式,则DEBUG_MODE=true;
- 如果是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");
}