gpt4 book ai didi

java - 在 Java 属性中使用 Groovy 进行变量扩展

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:06:31 26 4
gpt4 key购买 nike

我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序。我一直缺少的一项功能是能够将变量用作属性值的一部分,这样它们就可以在使用过程中动态扩展。我想我可以使用以下设计来提供此功能:

  1. 使用特殊的格式来注释应该扩展的属性。我选择用双感叹号 (!!) 将此类模板括起来。这些属性值本质上是一个模板,可以使用局部变量进行扩展
  2. 在应用程序中使用属性之前,使用 groovy 'evaluate' 方法在模板中扩展应用程序变量
  3. 使用前将原来的属性键重新赋值给新的值

所以,如果我有一个属性文件config.properties,其属性如下:

version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!

local_lib 属性将从 GROOVY_HOME 环境变量和 version 属性值扩展。

在我的应用程序中,我将其编码如下:

//Load the environment variables and configuration file
env=System.getenv()
configFile=new File('config.properties')
configProps= new Properties()
configProps.load(configFile.newDataInputStream())

//Replace configuration property values with their expanded equivalent
configProps.each{
//if a property value is a template we evaluate it
if (it.value.startsWith('!!')){
valTemplate=it.value.replace('!!','"')
it.value=evaluate(valTemplate)
}
}

//then we use the expanded property values

这似乎可行。当我做的时候

println configProps

我看到该值已扩展且不为空

但是,扩展属性的 getProperty 方法返回 null。

assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib'
| | |
| null false
[local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3]

造成这种差异的原因是什么?我本希望返回属性映射中显示的值。

最佳答案

您的 local_lib 值看起来像一个 String,但它不是。它是一个 GString,仅在需要时懒惰地强制转换为 String(例如打印出 configProps 映射值时)。

因此,Properties.getProperty() 的一个鲜为人知的效果在这里生效。当实际映射值不是字符串时,Properties.getProperty() 返回 null

因此,为了获得所需的行为,您需要在将值存储到属性映射之前将 GString 强制转换为 String。像这样:

it.value=evaluate(valTemplate).toString()

it.value=evaluate(valTemplate) as String

然后您应该会在下游看到所需的结果。

关于java - 在 Java 属性中使用 Groovy 进行变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038580/

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