`
貌似掉线
  • 浏览: 256994 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA如何实现条件编译(从思路开始)

阅读更多
这是我博客中的原文:
http://msdxblog.sinaapp.com/?p=57

  条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:
#IFDEF DEBUG
#UNDEF DEBUG
#ENDIF
#define DEBUG
#IFDEF DEBUUG
  /*
   code block 1
   */ 
#ELSE
  /*
   code block 2
  */
#ENDIF


  但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们可能需要条件编译。那么,在JAVA中,该如何实现条件编译呢?
  我们来看一个例子。
  编写一个helloworld程序。代码如下:
public class Hello {
	public static void main(String[] args) {
		System.out.println("Hello, world!");
	}
}


  保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:
import java.io.PrintStream;

public class Hello
{
  public static void main(String[] paramArrayOfString)
  {
    System.out.println("Hello, world!");
  }
}


  得到这个有什么用呢?
  现在我们再来对源代码进行修改,修改后的代码如下。
public class Hello {
	public static void main(String[] args) {
		if(false) {
			System.out.println("Hello, world!");
		}
	}
}


  进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:
public class Hello
{
  public static void main(String[] paramArrayOfString)
  {
  }
}


  利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。
public class Hello {
	public static void main(String[] args) {
		if(false) {
			System.out.println("Hello, world!");
		}
	}
}


  定义一个final的变量,然后再在if语句中使用。代码如下:
public class Hello {
	public static void main(String[] args) {
		final boolean DEBUG = true;
		if(DEBUG) {
			System.out.println("Hello, world!");
		}
	}
}


  当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:
public class DebugConfig {
	public static final boolean BLUETOOTH_DEBUG = false;
	public static final boolean WIRELESS_DEBUG = false;
}

if ( DebugConfig.BLUETOOTH_DEBUG) {
	// TODO 
}


  最最后,说一句,俺阿威师兄建议用版本控制解决这个问题(这绝对是好建议,俺振德老师就建议俺们玩一下SVN)。
分享到:
评论
4 楼 貌似掉线 2011-12-03  
laiweiweihi 写道
期待.

你这评论跟在群里的严重不一致……
3 楼 laiweiweihi 2011-12-03  
期待.
2 楼 貌似掉线 2011-12-03  
xiaozhi6156 写道
好吧,学会一招了~
if(false)  相等于注释了`

==
你居然把它等于注释……
1 楼 xiaozhi6156 2011-12-03  
好吧,学会一招了~
if(false)  相等于注释了`

相关推荐

    疯狂JAVA讲义

    9.6.1 Java国际化的思路 346 9.6.2 Java支持的语言和国家 346 9.6.3 完成程序国际化 347 9.6.4 使用MessageFormat处理包含占位符的字符串 349 9.6.5 使用类文件代替资源文件 350 9.6.6 使用NumberFormat格式化...

    Java虚拟机

    第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 262 10.2.3 注解处理器 / 264 10.2.4 语义分析与字节码生成 / 264 10.3 Java语法糖的味道 / 268 10.3.1 泛型与类型擦除 / 268 10.3.2 自动装箱、拆箱与遍历循环 / 273 10.3.3 条件编译 / 275 10.4 实战:...

    java版商城源码-MarketAndroidApp:购物商城安卓客户端。帮女朋友顺手做的大作业,提供了一个简易的商城App实现思路

    提供了一个简易的购物商城App的实现思路,能完成大部分购物商城应有的功能。其中:添加收货地址,添加收货人信息,使用支付宝/微信支付等功能未开发 (也不打算开发) 希望可以给大家完成自己的商城App提供一个思路! ...

    Java开发技术大全 电子版

    2.4.4条件运算符和条件表达式48 2.4.5位运算符和位运算表达式50 2.4.6赋值运算符和赋值表达式53 2.4.7表达式的求值顺序55 2.5流程控制语句58 2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句...

    java版商城源码下载-MarketAndroidApp:市场AndroidApp

    提供了一个简易的购物商城App的实现思路,能完成大部分购物商城应有的功能。其中:添加收货地址,添加收货人信息,使用支付宝/微信支付等功能未开发 (也不打算开发) 希望可以给大家完成自己的商城App提供一个思路! ...

    java版商城源码下载-MarketAndroidApp-master:MarketAndroidApp-master

    提供了一个简易的购物商城App的实现思路,能完成大部分购物商城应有的功能。其中:添加收货地址,添加收货人信息,使用支付宝/微信支付等功能未开发 (也不打算开发) 希望可以给大家完成自己的商城App提供一个思路! ...

    突破程序员基本功的16课.part2

    第3课 常见Java集合的实现细节 3.1 Set和Map 3.1.1 Set和Map的关系 3.1.2 HashMap和HashSet 3.1.3 TreeMap和TreeSet 3.2 Map和List 3.2.1 Map的values()方法 3.2.2 Map和List的关系 3.3 ArrayList和...

    基于模板的代码生成器LKGenerator1.1.0_x64

    实现思路:加载实体类的class文件到classLoader中,读取实体类的属性和注解,将类名、属性字段名、注解三者与模版进行结合生成最终的代码。 1.配置 (1)配置模版路径,这个配置可以配置用于生成代码的velocity模版...

    基于模板的代码生成器LKGenerator1.1.0_x86

    实现思路:加载实体类的class文件到classLoader中,读取实体类的属性和注解,将类名、属性字段名、注解三者与模版进行结合生成最终的代码。 1.配置 (1)配置模版路径,这个配置可以配置用于生成代码的velocity模版...

    二十三种设计模式【PDF版】

    如果你是一个新手,那么从开始就 培养自己良好的编程习惯(让你的的程序使用通用的模式,便于他人理解;让你自己减少重复性的编程工作),这无疑是成为一个优秀 程序员的必备条件. 整个设计模式贯穿一个原理:面对接口编程...

    Python语言程序设计PPT课件.zip

    每一章开始的思维导图都是对本章技术脉络的梳理,开门见山地给学习者展示本章的知识和技术体系,以便学习者在学习过程中始终能保持思路清晰和整体把握。每一章开头的本章导读都是编者多年来程序开发与设计教学经验的...

    Python语言程序设计习题答案.zip

    每一章开始的思维导图都是对本章技术脉络的梳理,开门见山地给学习者展示本章的知识和技术体系,以便学习者在学习过程中始终能保持思路清晰和整体把握。每一章开头的本章导读都是编者多年来程序开发与设计教学经验的...

    C# Winform数据库应用设计(附开发案例

    从本门课开始我们将要开始学习¢#语言和NET平台。本章将使学员对NET和¢#有一个 初步的认识,了解C#的开发环境,编写第一个C#控制台应用程序。C#语言的基本语法和我 们之前的学习的C语言、Java语言一样同属于C语言语法...

    华为编程开发规范与案例

    1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和...

Global site tag (gtag.js) - Google Analytics