我有一堂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
}
的静态变量。
我该怎么做?有没有办法获取类中的所有静态用户定义变量(从而将每个变量的值与我想要的值进行比较)?
修改 由于某些技术原因,我无法更改类定义。
答案 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,您还可以编辑那里的方法和静态。它也应该比反射更快