如何检查groovy类是否具有静态属性?

时间:2012-01-04 10:06:48

标签: groovy

鉴于以下groovy类:

​class A {
    static x = { }
}

如何检查A类是否定义了名为“x”的静态属性? 下面的选项似乎都不起作用:

A.hasProperty('x')
A.metaClass.hasProperty('x')

5 个答案:

答案 0 :(得分:5)

除了使用Java的反射API之外,我无法看到更加流畅的方式:

import static java.lang.reflect.Modifier.isStatic

class A {
  static x = 1
}

def result = A.class.declaredFields.find { 
    it.name == 'x' && isStatic(it.modifiers)
}

println result == null ? 'class does not contain static X' : 
                         'class contains static X'

答案 1 :(得分:3)

查看GrailsClassUtils.getStaticFieldValue - 它按名称返回静态字段值,如果没有属性或未设置,则返回null。如果有帮助,您可以查看实施

答案 2 :(得分:2)

A.metaClass.hasProperty(A,'x')

A.metaClass.respondsTo(A,'getX')

答案 3 :(得分:0)

我看不到任何直接检查静态属性的明显方法,但检查名为getProperty的静态方法是等效的(我认为)

def getStaticProperty(String name, Class clazz) {
  def noArgs = [].toArray()
  def methodName = 'get' + name[0].toUpperCase()

  if (name.size() > 1) {
    methodName += name[1..-1]
  }

  clazz.metaClass.getStaticMetaMethod(methodName, noArgs)
}

// class that will be used in tests
class Foo {

  static String x = 'bar'
  static Integer num = 3
}

// tests
assert getStaticProperty('x', Foo)
assert getStaticProperty('num', Foo)
assert getStaticProperty('noSuchProperty', Foo) == null

答案 4 :(得分:0)

截至2017年和groovy 2.4.x,检查的最佳方法似乎是:

A.metaClass.getMetaProperty('x') != null

它既适用于静态属性,也适用于仅使用getter和setter(但没有实际字段)定义的属性,也适用于没有getter或setter的字段(例如,在java类中)。如果需要,您可以检查返回的MetaProperty以获取更多详细信息。请注意,属性可能仅由setter定义,因此不可读。因此,如果重要,请相应调整您的支票。

但请注意,此方法不允许检查属性是否为静态。

sudhir回答可能是第二好的,因为它的实现依赖于getDeclaredFields,因此,找不到仅由getter和setter定义的属性。它也只有在你使用grails时才有用。如果存在,它也会获取可能需要或可能不需要的实际值。

SteveD的答案不起作用。然而,可以通过在declaredFields之前删除'class'并添加对getter和setter的检查来修复。 因此,对财产存在的全面检查如下:

def hasProperty = { Class c, String propertyName ->
    if (!propertyName)
        return false;
    String p2 = propertyName.substring(0, 1).toUpperCase()
    if (propertyName.length()> 1)
        p2 += propertyName.substring(1)
    return c.declaredFields.find {
        it.name == propertyName /* && isStatic(it.modifiers) */
    } || c.declaredMethods.find {
        it.name == ('get' + p2) /* && isStatic(it.modifiers) */
    } || c.declaredMethods.find {
        it.name == ('is' + p2) /* && isStatic(it.modifiers) */
    } || c.declaredMethods.find {
        it.name == ('set' + p2)/* && isStatic(it.modifiers) */
    }
}

请注意,此方法还会检查该属性是否为静态(只需导入静态java.lang.reflect.Modifier.isStatic并取消注释isStatic检查)。同上,请注意仅限setter的属性。