Java条件编译

学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译。Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件做了优化,下面通过一个例子给大家详细讲解。

下面先给出HelloWorld.java文件:

 1 package com.test;
 2
 3 /**
 4  * Test Demo
 5  */
 6 public class HelloWorld {
 7
 8     public static void main(String[] args) {
 9         if (BuildConfig.FLAG) {
10             System.out.println("Hello World");
11         } else {
12             System.out.println("Java条件编译测试");
13         }
14     }
15
16 }

再来看看BuildConfig.java文件:

package com.test;

/**
 * Created by Administrator on 2015/5/24.
 */
public final class BuildConfig {

    public static final boolean FLAG = false;
}

再来看看该.java文件被转化为.class文件的内容:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.test;

public class HelloWorld {
    public HelloWorld() {
    }

    public static void main(String[] args) {
        System.out.println("Java条件编译测试");
    }
}

可以知道的是BuildConfig.FLAG永远都为false,if块内的代码当然也不会被执行,这部分代码就不会被编译到.class文件中。

  如果FLAG是字符串会怎么样?字符串之间如果使用equals进行比较,在转化为.class文件时不会得到优化。

HelloWorld.java文件:

package com.test;

/**
 * Test Demo
 */
public class HelloWorld {

    public static void main(String[] args) {
        if (BuildConfig.FLAG.equals("false")) {
            System.out.println("Hello World");
        } else {
            System.out.println("Java条件编译测试");
        }
    }

}

HelloWorld.class文件:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.test;

public class HelloWorld {
    public HelloWorld() {
    }

    public static void main(String[] args) {
        if("false".equals("false")) {
            System.out.println("Hello World");
        } else {
            System.out.println("Java条件编译测试");
        }

    }
}

如果真的需要字符串比较,实现条件编译的话可以使用 "=="。

HelloWorld.java文件:

package com.test;

/**
 * Test Demo
 */
public class HelloWorld {

    public static void main(String[] args) {
        if (BuildConfig.FLAG == "false") {
            System.out.println("Hello World");
        } else {
            System.out.println("Java条件编译测试");
        }
    }

}

HelloWorld.class文件:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.test;

public class HelloWorld {
    public HelloWorld() {
    }

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
时间: 2024-12-28 16:41:18

Java条件编译的相关文章

Thinking in java Chapter6 访问权限控制

访问权限控制的等级,从最大权限到最小权限:public proteced 包访问权限 private 6.1 包:库单元 public class FullQualification { public static void main(String[] args) { java.util.ArrayList list = new java.util.ArrayList<>(); } } import java.util.ArrayList; public class SingleImport

Android平台Java代码的条件编译问题

在代码的开发过程中,不管是C/C++也好,Java也罢,都要面对在平台移植的问题, 所以不可避免的要考虑条件编译的问题. 在C/C++代码的开发中,条件编译的实现很容易实现,可以分成二种:一种是在单个代码文件中通过 #ifdef ... #endif 或者 #if ... #endif 的方式选择性编译文件中的代码,另一种是在Makefile中通过宏判断来选择性编译某个文件.在Java代码的开发中,实现条件编译则没有直接对应的方法,但是仍然可以采用变通的方法来实现条件编译. 对于单个文件内的的代

Java中的条件编译(转)

源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/C++中使用#ifdef...#endif的代码,如果不满足条件,编译器是不会对这部分代码进行编译的.但是Java中没有宏定义啊,怎么办呢? 其实在Java中也有解决办法. Java编译器优化机制中有这么一条:对于条件表达式中永远为false的语句,编译器将不对条件覆盖的代码段生成字节码. 例如:

[Java基础] Java如何实现条件编译

条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译.那么,在JAVA中,该如何实现条件编译呢? 条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.代码如下: #IFDEF DEBUG #UNDEF DEBUG #ENDIF #define DEBUG #IFDEF DEBUUG /* code block 1 */ #ELSE /* code block 2

如何用Java实现条件编译

在 C 或 C++ 中,可以通过预处理语句来实现条件编译.代码如下: #define DEBUG #IFDEF DEBUUG /* code block 1 */ #ELSE /* code block 2 */ #ENDIF 而Java中却没有预处理,宏定义这些东西,而有时在一些项目中,我们可能需要条件编译.那么,在 Java 中,该如何实现条件编译呢? 办法是有的:定义一个 final 的变量,然后在 if 语句用中它隔开代码. public class Hello { public sta

Java 中的语法糖

定义:指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是 泛型:ava的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型 public static void main(String[] args) { List<String> stringList = new ArrayList<String&g

深入理解java虚拟机(十二) Java 语法糖背后的真相

语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言的功能产生任何影响,却能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会.但是如果只是大量添加和使用语法糖,却不去了解他,容易产生过度依赖,从而无法看清语法糖的糖衣背后,程序代码的真实面目. 总而言之,语法糖可以看做是编译器实现的一些"小把戏",这些"小

深入理解 Java 虚拟机之学习笔记(1)

本书结构: 从宏观的角度介绍了整个Java技术体系.Java和JVM的发展历程.模块化,以及JDK的编译 讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因 分析了虚拟机的执行子系统,包括类文件结构.虚拟机类加载机制.虚拟机字节码执行引擎 讲解了程序的编译与代码的优化,阐述了泛型.自动装箱拆箱.条件编译等语法糖的原理 讲解了虚拟机的热点探测方法.HotSpot的即时编译器.编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果 探讨了Java实现高

7.JAVA编程思想笔记隐藏实施过程

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项基本的考虑是:如何将发生变化的东西与保持不变的东西分隔开." Java 推出了"访问指示符"的概念,允许库创建者声明哪些东西是客户程序员可以使用的,哪些是不可使用的.这种访问控制的级别在"最大访问"和"最小访问"的范围之间,分别包括:public,"友好的