Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查groovy类是否具有静态属性?_Groovy - Fatal编程技术网

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

如何检查groovy类是否具有静态属性?,groovy,Groovy,给定以下groovy类: ​class A { static x = { } } 如何检查类A是否定义了名为“x”的静态属性? 以下两种选择似乎都不起作用: A.hasProperty('x') A.metaClass.hasProperty('x') 我看不到任何直接检查静态属性的明显方法,但检查名为getProperty的静态方法是等效的(我认为) 除了使用Java的反射API之外,我看不到更为常规的方法: import static java.lang.reflect.Modi

给定以下groovy类:

​class A {
    static x = { }
}
如何检查类A是否定义了名为“x”的静态属性? 以下两种选择似乎都不起作用:

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

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


除了使用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'
查看-按名称返回静态字段值,如果不存在或未设置属性,则返回null。如果有帮助的话,您可以查看实现

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


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

A.metaClass.getMetaProperty('x') != null
它适用于静态和非静态属性,以及仅使用getter和setter(但没有实际字段)定义的属性,或者由没有getter或setter的字段定义的属性(例如,在java类中)。如果需要,可以检查返回的元属性以了解更多详细信息。请注意,属性可能仅由setter定义,因此不可读。因此,如果这很重要,请相应地调整您的支票

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

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

史蒂文的回答不起作用。但是可以通过删除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属性

静态(Java)字段是否与静态(Groovy)属性相同?不幸的是,链接不再有效。即使链接失效,您仍然可以使用GrailsClassUtils
A.metaClass.getMetaProperty('x') != null
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) */
    }
}