如何在运行时访问java编译时参数?

时间:2017-02-15 18:48:33

标签: java

我们正在将用C编写的系统迁移到Java,并且必须保留现有的流程(没有争议)。我们目前使用C预处理器将编译时信息“嵌入”到C应用程序中,例如:

cc -o xxx.o -DCOMP_ARG='"compile time arg"' xxx.c

然后xxx.c文件可以使用“COMP_ARG”,它的值将嵌入代码中,我们不必担心它会被无意中更改。

我们意识到Java喜欢使用属性文件,但是,我们的要求是将某些信息嵌入到代码中,因此属性文件不是一个选项 - 这些特定值不能在运行时指定。为了说明这一点,这些数据可能是文件编译时的日期戳,但确切的数据与问题无关。

我们正在寻找一种在编译时指定Java代码可用的各种值的方法。我们非常清楚Java没有像C那样的预处理器,因此机制会有所不同。

我们当前的解决方案是使用代码生成步骤(Maven),它确实有效,然而,Eclipse正在试图处理源文件,以便我们关闭“自动构建”。我们真的想找到一个更强大的解决方案。

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

  

然后xxx.c文件可以使用" COMP_ARG"它的价值将被嵌入   在代码中我们不担心它被改变了   无意中。

     

...我们的要求是将一些信息嵌入到   代码....

     

我们正在寻找一种在编译时指定各种值的方法   Java代码可用的。我们非常清楚Java确实如此   像C一样没有预处理器,所以机制就是   不同。

似乎解决此问题的最佳方法是在代码中使用注释

在Java中,注释是一种接口声明,但它们不强制实现与实现类的行为契约。相反,它们旨在与某些外部框架,预处理器或编译器本身定义合同。注释在Java EE 5.0(及更高版本)中广泛使用,以指定开发人员代码运行的框架的配置和行为。 JavaDoc文档处理器也广泛使用注释。在这里,doc注释中的注释允许您指定和格式化JavaDoc处理器运行时您打算在文档中出现的信息。

可以将注释定义为可在运行时访问。在这种情况下,访问注释的主要机制是Java Reflection工具。例如,保留策略为RUNTIME并在类上定义的注释可以通过该类对应的Class对象访问:

Class myCls = MyClass.class;   // the "class literal" for MyClass
Annotation[] annotations = myCls.getDeclaredAnnotations();

注释可以包含参数参数,以便在配置中提供更大的灵活性。当代码本身可以这样注释时,使用注释是最方便的。

如何在Java中定义和使用注释的快速教程:https://docs.oracle.com/javase/tutorial/java/annotations/

答案 1 :(得分:0)

我要发布自己的答案,似乎是"无法完成" - 显然,可以在编译时向Java提供什么,这是一组在执行时传递给程序的参数。解决方案似乎是继续我正在做的事情,即使用编译时数据更新Java源文件,并弄清楚如何使Eclipse停止覆盖文件。

感谢所有评论的人。