Grails检查类是否具有带特定值的静态变量

时间:2015-10-17 12:52:04

标签: grails groovy

我有一堂Grails课程,如:

import itertools
import random

size = 10
pts = [pt for pt in itertools.product(range(size), range(size), range(size))]
random.shuffle(pts)
print pts

我想简单地发现上面的类有一个值为class Autoresponder { static String TYPE_NONE = "none" static String TYPE_GETRESPONSE = "GetResponse" static String TYPE_MAILCHIMP = "MailChimp" static String TYPE_AWEBER = "AWeber" static String TYPE_INFUSIONSOFT = "InfusionSoft" static String TYPE_ICONTACT = "iContact" static String TYPE_SENDY = "Sendy" static String TYPE_ACTIVECAMPAIGN = "ActiveCampaign" static String TYPE_API_ACTIVATE = "activate" static String TYPE_ONTRAPORT = "ontraport" //rest of code } 的静态变量。 我该怎么做?有没有办法获取类中的所有静态用户定义变量(从而将每个变量的值与我想要的值进行比较)?

修改 由于某些技术原因,我无法更改类定义。

3 个答案:

答案 0 :(得分:4)

只需迭代所有静态字段,查找具有所需值的字段。如下面的groovy脚本示例

import static java.lang.reflect.Modifier.isStatic

class Autoresponder {
    static String TYPE_NONE = "none"
    static String TYPE_GETRESPONSE = "GetResponse"
    static String TYPE_MAILCHIMP = "MailChimp"
    static String TYPE_AWEBER = "AWeber"
    static String TYPE_INFUSIONSOFT = "InfusionSoft"
    static String TYPE_ICONTACT = "iContact"
    static String TYPE_SENDY = "Sendy"
    static String TYPE_ACTIVECAMPAIGN = "ActiveCampaign"
    static String TYPE_API_ACTIVATE = "activate"
    static String TYPE_ONTRAPORT = "ontraport"
}    

def getStaticAttributeWithValue(Class clazz, Object searchedValue) {
    clazz.declaredFields
        .findAll{ isStatic(it.modifiers) }
        .find { clazz[it.name] == searchedValue }
}

assert getStaticAttributeWithValue(Autoresponder, "AWeber") != null
assert getStaticAttributeWithValue(Autoresponder, "NonExist") == null

如果函数返回null,则没有带该值的静态字段,否则它将不为null。 (实际上它将是java.lang.reflect.Field

类型的对象

还有另一种获取类中所有静态属性的方法,即使用groovy MetaClass,但想法是一样的

def getStaticAttributeWithValue(Class clazz, Object searchedValue) {
    clazz.metaClass.properties
        .findAll{ it.getter.static }
        .find { clazz[it.name] == searchedValue }
}

通过这种方式,您将获得groovy.lang.MetaBeanProperty

答案 1 :(得分:3)

最简单的方法是使用GrailsClassUtils.getStaticFieldValue查看Grails中的Groovy类是否具有给定值的静态属性。

上面的实用程序类还有其他方法,您可能也会觉得有用。

答案 2 :(得分:1)

尝试使用MetaClass。像(没有测试......只是一个想法):

String val
if(Autoresponder.metaClass.static.AWeber){
    val = Autoresponder.AWeber
}

使用MetaClass,您还可以编辑那里的方法和静态。它也应该比反射更快