这是我博客中的原文:
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)。
分享到:
相关推荐
3. **学习研究**:分析已有的成熟软件,学习其设计思路和实现方式。 常用的Java Class反编译工具有: 1. **JD-GUI**:一个直观的图形界面工具,可以快速查看单个类的反编译结果。 2. **JAD**:命令行工具,支持...
以上是使用Java实现JavaScript`eval`功能的基本思路和方法。需要注意的是,这种模拟`eval`的行为可能会带来安全风险,因为用户提供的输入可能包含恶意代码。因此,在实际应用中,务必对输入进行严格的验证和限制,...
### 一种Java与OpenCV结合实现的目标检测模块 #### 概述 随着计算机视觉技术的发展,将目标检测功能集成到视频应用中变得越来越重要。本文介绍了一种将Java与OpenCV相结合来实现目标检测模块的方法。这种方法充分...
提供的“编译原理综合设计报告.doc”很可能是对整个过程的详细记录和解释,包括设计思路、实现细节和遇到的问题。而“compiler.java.rar”可能包含了你的源代码实现,你可以通过阅读和分析这些代码来深入理解编译...
### AOP及其Java实现机制 #### 1. 引言 传统的编程技术通过分解的方式将一个复杂的软件系统拆分成相对较小、易于管理和理解的模块。然而,在实际开发过程中,一些跨模块的行为(如日志记录、事务管理等)难以封装...
- "javaanpr" 文件可能包含了项目的源代码,用户可以直接编译运行,也可以参考其设计思路进行二次开发。 5. **机器学习模型的训练** - 训练一个高效的字符识别模型需要大量的标注数据,包括不同条件下的车牌图像...
首先,"SSQ.jar" 文件是一个Java的可执行jar包,它包含了已经编译好的双色球软件的全部类和资源。用户可以直接运行此文件来启动应用程序,无需了解内部的具体实现。运行jar包需要Java环境支持,可以通过命令行工具`...
2. "说明.txt" - 这很可能是对计算器项目的简要说明,可能包含了编译和运行程序的步骤,或者是关于程序功能、设计思路的额外解释。 总结来说,本项目旨在通过Java编程实现一个简单的计算器,涉及的关键技术包括:...
在进行课程设计时,你不仅需要实现上述各个阶段,还需要编写文档来详细记录你的设计思路、实现方法以及遇到的问题和解决方案。代码部分应该清晰易懂,便于他人理解和复用。 总之,"编译原理 课程设计 实验一:源...
在Java代码中,这部分通常会通过条件语句实现。 6. **控制台输出**:游戏结果和过程会通过`System.out.println()`在控制台显示,为用户提供实时反馈。 7. **类结构**:虽然只提供了一个文件名,但通常一个完整的...
为了实现这个功能,你需要用到Java的随机数生成、用户输入读取以及if...else语句进行条件判断。同时,用while循环控制用户可以反复尝试,直到猜对为止。 实验后的练习: 1. 思考最佳的猜数方案,理论上,最高效的...
本文将详细介绍Java混淆器的设计思路、实现方法以及应用案例。 #### 二、混淆变换的概念 混淆变换是指在不改变程序逻辑和功能的前提下,对程序进行转换,使其反编译结果变得难以理解的过程。具体来说,混淆变换...
在这个项目中,我们关注的是一个基于Java实现的万年历程序。万年历是一种能显示公历日期、节气、节假日等信息的实用工具,对于日常安排和时间管理非常有帮助。 标题中的"java万年历源代码"指的是使用Java语言编写的...
此外,"Lingxing.class"是编译后的Java字节码文件,它是Java源代码(如"Lingxing.java")经过javac编译器转换后的产物,可供Java虚拟机执行。"说明.txt"可能是对程序的简短解释或使用指南,但具体内容需要打开文件...
总的来说,这个Java实现的实验涵盖了编译器设计的核心部分,从词法分析器的构建,到语法分析器的设计,再到三地址代码的生成,都是编译技术的重要组成部分。通过这样的实践,学习者能够深入理解编译器的工作原理,并...
Java程序通过编译成字节码(.class文件),可以在任何安装了Java虚拟机(JVM)的平台上运行,实现了“一次编写,到处运行”的理念。 在压缩包中,可能包含的文件名如“0810”可能代表书中的第8章第10节,这通常是一...
1. **基础语法**:这是Java学习的起点,包括变量声明、数据类型(如基本类型和引用类型)、运算符、流程控制语句(如if条件语句、switch语句、for和while循环)以及方法定义。 2. **类与对象**:Java是一种面向对象...