我有一个不为空的变量对象 foo,我想使用 foo.bar,但仅当它不会报错 'No such property: bar for class: Whatever' 时。如何进行以下测试:
if (/*test-here*/) {
use(foo.bar)
}
if (/*test-here*/) {
use(foo.bar)
}
使用object.hasProperty(propertyName)
。如果属性存在,它将返回一个真值(属性引用)。还可以使用object.metaClass.hasProperty(instance, propertyName)
。使用object.respondsTo(methodName)
来测试方法是否存在。
我在我的Gradle脚本中这样做:
if(project.hasProperty("propertyThatMightExist")){
use(propertyThatMightExist)
}
如果你需要在许多foo和bar上执行此操作,可以事先编写以下代码(在创建foo之前):
Object.metaClass.getPropertySafe =
{ delegate.hasProperty(it)?.getProperty(delegate) }
foo.getPropertySafe('bar')
Customer.metaClass.properties.find{it.name == 'propertyName'}.
在这个例子中,Customer是一个领域类。不确定它是否适用于普通的Groovy类。
Customer.metaClass.getMetaProperty('propertyName')
。 - jaco0646boolean exist = Person.metaClass.properties.any{it.name == 'propName'}
//反之亦然
。我不能为Groovy具体发言,但在我使用过的几乎所有动态语言中,惯用的做法就是直接实现它,如果出现异常则捕获异常,在异常处理程序中执行任何必要的操作以合理地处理情况。
binding.hasVariable(variableName)
。 - Jesse Glick== null
。 - Sridhar Sarnobat