首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groovy中的静态属性Intercept

groovy中的静态属性Intercept
EN

Stack Overflow用户
提问于 2015-07-16 22:19:28
回答 1查看 82关注 0票数 2

我在groovy中创建了一个配置类,如下所示

代码语言:javascript
复制
class EnvironmentConfig {
    String configFilePath
    Config envConfig

    public EnvironmentConfig (String configFilePath) {
        this.configFilePath = configFilePath
        envConfig = ConfigFactory.load(configFilePath)
    }

    def propertyMissing(String name) {
        envConfig.getString(name)
    }
}

这个想法是,当我的应用程序启动时,这个类应该只实例化一次,并且每个其他的类都应该能够访问这个类。现在我已经写了一个非常小的主类来检查一些东西。

代码语言:javascript
复制
public static void main(String[] args) {
    EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
    println "${envConfig.TESS_WORKDIR}"
}

这很好用,但是如果我像这样写的话

代码语言:javascript
复制
public static void main(String[] args) {
    EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
    println "${EnvironmentConfig.TESS_WORKDIR}"
}

它不起作用,我希望任何类都应该能够只使用EnvironmentConfig.TESS_WORKDIR,并且调用应该被路由到missingProperty方法,在那里它应该返回一些值。

EN

回答 1

Stack Overflow用户

发布于 2015-07-16 22:42:55

看起来下面的代码完成了这项工作,并没有对其进行广泛的测试:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31456881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档