Java:将常量设置为编译参数

Java:将常量设置为编译参数,java,ant,compilation,constants,manifest,Java,Ant,Compilation,Constants,Manifest,我想在java程序中设置一个常量,但我不希望它出现在代码中,而是作为编译参数。我该怎么做?作为清单属性?如何恢复价值 其要点是运行一个自动的多重编译来更改这个常量 我来自C世界,所以在Java中这可能是个坏主意。我愿意接受所有建议 应用程序:我在散列中包含了一个salt,我想轻松地更改salt。这种配置通常存储在配置文件(通常是XML或属性)中,然后在运行时读取。您可以在生成时使用自定义的生成脚本自动生成配置文件,也可以手动将文件放入 另一种方法是使用命令行参数或环境变量传递配置。不过,文件方法

我想在java程序中设置一个常量,但我不希望它出现在代码中,而是作为编译参数。我该怎么做?作为清单属性?如何恢复价值

其要点是运行一个自动的多重编译来更改这个常量

我来自C世界,所以在Java中这可能是个坏主意。我愿意接受所有建议


应用程序:我在散列中包含了一个salt,我想轻松地更改salt。

这种配置通常存储在配置文件(通常是XML或属性)中,然后在运行时读取。您可以在生成时使用自定义的生成脚本自动生成配置文件,也可以手动将文件放入


另一种方法是使用命令行参数或环境变量传递配置。不过,文件方法可能是最简单和最健壮的。

您可以使用命令行上指定的系统属性:

java -Dmyprop=myvalue yourapp
然后通过以下方式在代码中访问它:

System.getProperty("myprop")

正如其他评论所说,除非您想进行字节码操作,否则无法注入真正的代码常量。如果您想进行字节码操作,您可以研究AST转换(java或groovy)或类似Javasist的项目,但这些解决方案要复杂得多。

java没有类似c的宏。。你找到了类似宏的东西吗?Java将常量推入外部的字节码是不自然的。你可以在执行时使用命令行参数,但我不知道是否可以在编译时设置参数。请回答。我的问题是,我不想让用户知道salt,使用配置文件就是这样。我不认为这是一种绝对的安全性,但对于我的应用程序来说,这种方式更好。另外,我希望同一版本的所有用户都具有相同的salt,因此也排除依赖于机器的配置。除非您对每个用户进行更改,否则salt是无用的。保守盐的秘密并不重要。关键是要阻止人们使用简单的大规模处理来破解密码,因为salting会更改每个单独的密码。不应该看得太远,它就像C定义的:D我不需要“实”常量,所以这个解决方案就可以了。然而,我注意到每个人关于这个解决方案的非通用用法的建议。我保证我不会经常这样做。这是一个运行时解决方案,对吗?每次运行程序时都必须设置此参数?当编译为只设置一次时,有没有办法做到这一点?