问题描述
我在groovy中创建一个配置类,如下所示
class EnvironmentConfig {
String configFilePath
Config envConfig
public EnvironmentConfig (String configFilePath) {
this.configFilePath = configFilePath
envConfig = ConfigFactory.load(configFilePath)
}
def propertyMissing(String name) {
envConfig.getString(name)
}
}
这个想法是,当我的应用程序启动时,该类仅应实例化一次,并且其他所有类都应该能够访问该类。 现在,我写了一个很小的主类来检查某些内容。
public static void main(String[] args) {
EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
println "${envConfig.TESS_WORKDIR}"
}
这很好,但是如果我这样写
public static void main(String[] args) {
EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
println "${EnvironmentConfig.TESS_WORKDIR}"
}
它不起作用,我希望任何类都应该能够只使用EnvironmentConfig.TESS_WORKDIR
并且应将调用路由到missingProperty
方法,并在该方法中返回一些值。
1楼
似乎以下代码可以完成这项工作,但并未对其进行广泛的测试:
class EnvironmentConfig {
Map m
EnvironmentConfig (Map m) {
this.m = m
this.class.metaClass.static.propertyMissing = { name ->
this.propertyMissing(name)
}
}
def propertyMissing(String name) {
this.@m[name]
}
}
EnvironmentConfig envConfig = new EnvironmentConfig([TESS_WORKDIR:1])
assert envConfig.TESS_WORKDIR == 1
assert EnvironmentConfig.TESS_WORKDIR == 1
envConfig = new EnvironmentConfig([:])
assert envConfig.TESS_WORKDIR == null
assert EnvironmentConfig.TESS_WORKDIR == null