Groovy: как проверить, будет ли доступ к свойствам успешным?
У меня есть переменная Object foo, которая не является нулевой. Я хочу использовать foo.bar, но только если он не будет бомбить меня "Нет такого свойства: bar для класса: что бы ни было".
Как мне сделать следующий тест:
if (#test-here#) {
use(foo.bar)
}
Ответы
Ответ 1
Используйте object.hasProperty(propertyName)
. Это вернет истинное значение (ссылка на свойство), если свойство существует. Также возможно object.metaClass.hasProperty(instance, propertyName)
. Используйте object.respondsTo(methodName)
для проверки существования метода.
Ответ 2
Я делаю это в своих сценариях Gradle:
if(project.hasProperty("propertyThatMightExist")){
use(propertyThatMightExist)
}
Ответ 3
Если вы делаете это на множестве фосов и баров, которые вы можете написать (один раз, но до создания foo):
Object.metaClass.getPropertySafe =
{ delegate.hasProperty(it)?.getProperty(delegate) }
Затем вы можете написать:
foo.getPropertySafe('bar')
Ответ 4
Это сработало для меня:
Customer.metaClass.properties.find{it.name == 'propertyName'}.
Клиент в этом примере является классом домена. Не уверен, что он будет работать для обычного класса Groovy
Ответ 5
boolean exist = Person.metaClass.properties.any{it.name == 'propName'}
если propName является атрибутом, exist = true // vice versa
Ответ 6
Я не могу говорить специально для Groovy в частности, но почти в каждом динамическом языке, который я когда-либо использовал, идиоматический способ сделать это - просто сделать это и поймать исключение, если оно будет выбрано, и в обработчик исключений делает все, что вам нужно, чтобы разумно справляться с ситуацией.