我有一个变量Object foo,它不是null。我想使用foo.bar,但只有当它不会用'没有这样的属性来轰炸我:bar for class:Whatever'时。
我应该如何进行以下测试:
if (/*test-here*/) {
use(foo.bar)
}
答案 0 :(得分:70)
使用object.hasProperty(propertyName)
。如果属性存在,这将返回一个truthy值(属性引用)。 object.metaClass.hasProperty(instance, propertyName)
也是可能的。使用object.respondsTo(methodName)
测试方法是否存在。
答案 1 :(得分:10)
我在Gradle脚本中执行此操作:
if(project.hasProperty("propertyThatMightExist")){
use(propertyThatMightExist)
}
答案 2 :(得分:5)
如果你在很多食物和酒吧上做,你可以写(一次,但在食物创建之前):
Object.metaClass.getPropertySafe =
{ delegate.hasProperty(it)?.getProperty(delegate) }
然后你可以写:
foo.getPropertySafe('bar')
答案 3 :(得分:3)
这对我有用:
Customer.metaClass.properties.find{it.name == 'propertyName'}.
此示例中的客户是域类。不确定它是否适用于普通的Groovy类
答案 4 :(得分:0)
boolean exist = Person.metaClass.properties.any{it.name == 'propName'}
如果propName是属性, exists = true // vice versa
答案 5 :(得分:-5)
我不能特别为Groovy说话,但在几乎所有动态语言中,我曾经使用惯用的方法来做这件事,并且如果它被抛出则捕获异常,并在异常处理程序中做任何你需要做的事情来明智地处理这种情况。