2015-10-17 42 views
4

我有一个类的静态变量:Grails的检查,如果一个类有类似的Grails与特定值

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 
} 

我想简单地找到上述类与价值AWeber一个静态变量。 我该怎么做?有没有办法在类中获取所有静态用户定义的变量(从而将每个变量的值与我想要的值进行比较)?

编辑: 由于一些技术原因,我不能改变类的定义。

+0

使其成为枚举并遍历枚举值 – Tunaki

+0

@Tunaki我无法更改类定义。 – rahulserver

+0

该类是Groovy还是Java类? –

回答

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,则是与价值不产生静电场,否则,这将是不为空。 (实际上这将是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而不是

3

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

上面的工具类有其他方法,您可能也会发现有帮助。

+0

getStaticField值会要求我知道变量名称。如果我只是有价值,而且我知道价值是字符串类型呢? – rahulserver

+0

嗯,这很容易使用'metaClass',在另一个答案中已经指出。 –

1

尝试去与MetaClass。喜欢的东西(未测试...只是一个想法):

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

随着MetaClass的,你也可以编辑在那里的方法和静。它也应该比反射更快