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

50
我有一个不为空的变量对象 foo,我想使用 foo.bar,但仅当它不会报错 'No such property: bar for class: Whatever' 时。如何进行以下测试:
if (/*test-here*/) {
  use(foo.bar)
}
6个回答

94

使用object.hasProperty(propertyName)。如果属性存在,它将返回一个真值(属性引用)。还可以使用object.metaClass.hasProperty(instance, propertyName)。使用object.respondsTo(methodName)来测试方法是否存在。


9
请注意,这种情况不适用于绑定中未定义的“_variable_”,您需要使用binding.hasVariable(variableName) - Jesse Glick
1
这个能在使用“object.property”获取键“property”的Map上工作吗? - Lee Meador
该死,我的Jenkins Groovy脚本导致“脚本不允许使用静态方法”。 - Sridhar Sarnobat
幸运的是,在我的情况下,我可以直接使用 == null - Sridhar Sarnobat

11

我在我的Gradle脚本中这样做:

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

8

如果你需要在许多foo和bar上执行此操作,可以事先编写以下代码(在创建foo之前):

Object.metaClass.getPropertySafe = 
    { delegate.hasProperty(it)?.getProperty(delegate) }

然后,您可以编写以下内容:
foo.getPropertySafe('bar')

对我来说,这个错误是“java.lang.Boolean.getProperty()方法没有签名可用于参数类型:(String)”。难道不应该是“delegate.hasProperty(it) ? getProperty(delegate) : null”吗? - Adrodoc

4
这对我很有帮助:
Customer.metaClass.properties.find{it.name == 'propertyName'}.

在这个例子中,Customer是一个领域类。不确定它是否适用于普通的Groovy类。


当您没有类的实例,即动态创建条件来查找实例时,这非常有效。 - Joseph
此外,Customer.metaClass.getMetaProperty('propertyName') - jaco0646

1
boolean exist = Person.metaClass.properties.any{it.name == 'propName'}

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

-8

我不能为Groovy具体发言,但在我使用过的几乎所有动态语言中,惯用的做法就是直接实现它,如果出现异常则捕获异常,在异常处理程序中执行任何必要的操作以合理地处理情况。


是的,我也这么想。但是我更喜欢在处理实际异常时使用异常处理,因为它更加友好于调试器。不管怎样,谢谢。 - fernacolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接