gpt4 book ai didi

java - 有没有办法在编译时为Java定义一个常量值

转载 作者:搜寻专家 更新时间:2023-10-30 21:16:01 28 4
gpt4 key购买 nike

当我以前用 C/C++ 编写库时,我养成了使用返回编译日期/时间的方法的习惯。这总是被编译到库中,因此可以区分库的构建。我通过在代码中返回 #define 得到了这个:

C++:

#ifdef _BuildDateTime_
char* SomeClass::getBuildDateTime() {
return _BuildDateTime_;
}
#else
char* SomeClass::getBuildDateTime() {
return "Undefined";
}
#endif

然后在编译时,我在构建脚本中有一个“-D_BuildDateTime_=Date”。

有没有什么方法可以在 Java 中实现这个或类似的功能,而无需记住手动编辑任何文件或分发任何单独的文件。

我从一位同事那里得到的一个建议是获取 ant 文件以在类路径上创建一个文件并将其打包到 JAR 中并让该方法读取它。

类似于(假设创建的文件名为“DateTime.dat”):

// I know Exceptions and proper open/closing 
// of the file are not done. This is just
// to explain the point!
String getBuildDateTime() {
return new BufferedReader(getClass()
.getResourceAsStream("DateTime.dat")).readLine();
}

在我看来,这是一种 hack,可能会被 JAR 文件但在类路径上的类似命名文件的人规避/破坏。

无论如何,我的问题是是否有任何方法可以在编译时将常量注入(inject)到类中

编辑

我考虑在 JAR 中使用外部生成的文件的原因是因为这) 一个库并将嵌入到客户端应用程序中。这些客户端应用程序可能会定义自己的类加载器,这意味着我不能依赖标准的 JVM 类加载规则。

我个人的偏好是按照 serg10 的建议使用 JAR 文件中的日期。

最佳答案

我赞成基于标准的方法。将您的版本信息(连同其他有用的发布者信息,例如内部版本号、颠覆版本号、作者、公司详细信息等)放在 jar 的 Manifest File 中。

这是一个有据可查且易于理解的 Java 规范。存在用于创建 list 文件(例如 core Ant taskmaven jar plugin )的强大工具支持。这些可以帮助自动设置一些属性——我已经将 maven 配置为在构建时将 jar 的 maven 版本号、Subversion 修订版和时间戳放入 list 中。

您可以在运行时使用标准 java api 调用读取 list 的内容 - 类似于:

import java.util.jar.*;

...

JarFile myJar = new JarFile("nameOfJar.jar"); // various constructors available
Manifest manifest = myJar.getManifest();
Map<String,Attributes> manifestContents = manifest.getAttributes();

对我来说,这感觉更像是一种更符合 Java 标准的方法,因此后续代码维护人员可能更容易遵循。

关于java - 有没有办法在编译时为Java定义一个常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/101267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com