Groovy:如何测试属性访问是否成功?

Groovy:如何测试属性访问是否成功?,groovy,properties,Groovy,Properties,我有一个变量对象foo,它不是null。我想使用foo.bar,但前提是它不会用“没有这样的属性:类的bar:Whatever”来轰炸我 我应该如何进行以下测试: if (/*test-here*/) { use(foo.bar) } 我不能具体地说Groovy,但在我使用过的几乎每种动态语言中,实现这一点的惯用方法就是这样做,在抛出异常时捕获异常,并在异常处理程序中执行您需要执行的任何操作,以便明智地处理这种情况。使用object.hasProperty(propertyName)。如果

我有一个变量对象foo,它不是null。我想使用foo.bar,但前提是它不会用“没有这样的属性:类的bar:Whatever”来轰炸我

我应该如何进行以下测试:

if (/*test-here*/) {
  use(foo.bar)
}

我不能具体地说Groovy,但在我使用过的几乎每种动态语言中,实现这一点的惯用方法就是这样做,在抛出异常时捕获异常,并在异常处理程序中执行您需要执行的任何操作,以便明智地处理这种情况。

使用
object.hasProperty(propertyName)
。如果属性存在,这将返回一个truthy值(属性引用)。也可以使用
object.metaClass.hasProperty(实例,propertyName)
。使用
object.respondsTo(methodName)
测试方法的存在性。

如果在大量的foo和条上执行此操作,则可以编写(一次,但在创建foo之前):

然后你可以写:

foo.getPropertySafe('bar')
这对我很有用:

Customer.metaClass.properties.find{it.name == 'propertyName'}.

本例中的Customer是一个域类。不确定它是否适用于普通Groovy类

我在Gradle脚本中这样做:

if(project.hasProperty("propertyThatMightExist")){
    use(propertyThatMightExist)
}

如果propName是一个属性,exist=true
//反之亦然

是的,我想是的。但我更喜欢对实际的异常使用异常处理,因为它对调试器更友好。无论如何,谢谢。如果您没有类的实例,也就是说,正在动态创建条件来查找实例,那么这将非常有效。另外,
Customer.metaClass.getMetaProperty('propertyName')
。请注意,这不适用于绑定中未定义变量的情况,您需要
binding.hasVariable(variableName)
。在可以使用“object.property”获取键“property”的值的映射上,这是否有效?
if(project.hasProperty("propertyThatMightExist")){
    use(propertyThatMightExist)
}
boolean exist = Person.metaClass.properties.any{it.name == 'propName'}