Class 静态成员上的Groovy getProperty()

Class 静态成员上的Groovy getProperty(),class,groovy,static,jvm,static-members,Class,Groovy,Static,Jvm,Static Members,这个问题可能会说明我对Groovy类是如何工作的缺乏了解,但我一直试图自己解决这个问题,但运气不好。我想在一个类上创建一个getProperty()方法,这样我就可以用Groovy的方式引用成员变量。这与公开它们不同,因为我确实希望在引用它们时完成一些逻辑。基本上,我正在尝试创建一个使用ConfigSlurper的配置Groovy类: class Configuration implements GroovyObject { private static ConfigObject confi

这个问题可能会说明我对Groovy类是如何工作的缺乏了解,但我一直试图自己解决这个问题,但运气不好。我想在一个类上创建一个getProperty()方法,这样我就可以用Groovy的方式引用成员变量。这与公开它们不同,因为我确实希望在引用它们时完成一些逻辑。基本上,我正在尝试创建一个使用ConfigSlurper的配置Groovy类:

class Configuration implements GroovyObject {
  private static ConfigObject config  = new ConfigSlurper().parse(new File("testing.conf").toURI().toURL())

  //This method is illegal, but it illustrates what I want to do
  public static String getProperty(String prop){
    config.getProperty(prop)
  }
}
如果上述类是合法的,那么我可以引用如下配置项:

Configuration.dbUser
相反,这需要使ConfigObject可用:

Configuration.config.dbUser

我知道,公开配置对象会更容易,但知道如何做到这一点(或者知道为什么不可能做到这一点)会帮助我更好地理解Groovy。

让它工作的唯一方法是通过元类:

class Configuration {
  private static ConfigObject config  = new ConfigSlurper().parse( "foo = 'bar'" )
}

Configuration.metaClass.static.propertyMissing = { name ->
  delegate.config[ name ]
}

println Configuration.foo

不过,也许还有更好的办法……

哦,你这个光荣的人。成功了,非常感谢!我曾尝试使用元类来定义getProperty静态方法,但没有成功。我知道你做了什么,这很有道理。因为这只是用于不经常调用的配置,所以我可以使用这种方法,但它很昂贵,可能不适合一般使用。