jvm早期(编译期)优化(三)条件编译

早期(编译期)指的是通过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");
    }

本篇博客作为博主的自我知识总结,同时也希望对看到这篇文章的小伙伴们有所帮助!

由于本人能力有限,如果文章有所疏漏或错误还请在评论区提出,大家一起成长!共勉!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值