学习过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文件:

  1. package com.test;
  2.  
  3. /**
  4. * Created by Administrator on 2015/5/24.
  5. */
  6. public final class BuildConfig {
  7.  
  8. public static final boolean FLAG = false;
  9. }

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

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5.  
  6. package com.test;
  7.  
  8. public class HelloWorld {
  9. public HelloWorld() {
  10. }
  11.  
  12. public static void main(String[] args) {
  13. System.out.println("Java条件编译测试");
  14. }
  15. }

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

  如果FLAG是字符串会怎么样?字符串之间如果使用equals进行比较,在转化为.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.equals("false")) {
  10. System.out.println("Hello World");
  11. } else {
  12. System.out.println("Java条件编译测试");
  13. }
  14. }
  15.  
  16. }

HelloWorld.class文件:

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5.  
  6. package com.test;
  7.  
  8. public class HelloWorld {
  9. public HelloWorld() {
  10. }
  11.  
  12. public static void main(String[] args) {
  13. if("false".equals("false")) {
  14. System.out.println("Hello World");
  15. } else {
  16. System.out.println("Java条件编译测试");
  17. }
  18.  
  19. }
  20. }

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

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 == "false") {
  10. System.out.println("Hello World");
  11. } else {
  12. System.out.println("Java条件编译测试");
  13. }
  14. }
  15.  
  16. }

HelloWorld.class文件:

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5.  
  6. package com.test;
  7.  
  8. public class HelloWorld {
  9. public HelloWorld() {
  10. }
  11.  
  12. public static void main(String[] args) {
  13. System.out.println("Hello World");
  14. }
  15. }

Java条件编译的更多相关文章

  1. Java 条件编译

    在C/C++中,使用#ifdef…#endif的代码,如果不满足条件,编译器是不会对这部分代码进行编译的.Java中并没有这种“条件编译”特性.这种特性在C语言里是用来解决代码的跨平台问题的,可以通过 ...

  2. Java知识点:条件编译

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

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. java没有条件编译

    摘自http://maosidiaoxian.iteye.com/blog/1290740 条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.代码如下: #IFDEF DE ...

  5. Java中的条件编译(转)

    源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/ ...

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

    条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译.那么,在JAVA中,该如何实现条件编 ...

  7. 如何用Java实现条件编译

    在 C 或 C++ 中,可以通过预处理语句来实现条件编译.代码如下: #define DEBUG #IFDEF DEBUUG /* code block 1 */ #ELSE /* code bloc ...

  8. java编译期优化

    java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...

  9. [译]C++, Java和C#的编译过程解析

    1.1.1 摘要 我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的博文中,我们将介绍非托管和托管语音的编 ...

随机推荐

  1. Linux 日常维护命令

    1   防火墙配置 1)重启后生效  开启: chkconfig iptables on  关闭: chkconfig iptables off 或者 /sbin/chkconfig --level  ...

  2. 【Go语言】I/O专题

    本文目录 1.bytes包:字节切片.Buffer和Reader 1_1.字节切片处理函数 1_1_1.基本处理函数 1_1_2.字节切片比较函数 1_1_3.字节切片前后缀检查函数 1_1_4.字节 ...

  3. js事件冒泡和事件捕获的区别

  4. POJ 3321 树状数组(+dfs+重新建树)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27092   Accepted: 8033 Descr ...

  5. SPFA导读及介绍(转载)

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  6. xshell的快捷键(非常实用)

    删除 ctrl + d      删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h      删除光标所在位置前的字符相当于VIM里hx或者dh ctrl + k      删除光标 ...

  7. IP地址的分类与寻址

    IP地址:有一种标识符,被TCP/IP协议簇的IP层用来标识 连接到因特网的设备.IP协议的第4版IPv4地址是32位地址,是连接地址,定义了每一个连接到因特网上的设备(可以认为是主机的别名),而不是 ...

  8. Lua语言

    下载使用Subline作为编辑器 1. 2.函数使用 function sayHello() print ('hello torch') end 3.定义变量 a print (a) 4.引入文件 r ...

  9. 杭电ACM 1013 Digital Root

    #include<stdio.h>#include<stdlib.h>#include<string.h>int main(){char s[100000];int ...

  10. HDU 4287 Intelligent IME(字典树数组版)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...