Подтвердить что ты не робот

Groovy: как проверить, будет ли доступ к свойствам успешным?

У меня есть переменная Object foo, которая не является нулевой. Я хочу использовать foo.bar, но только если он не будет бомбить меня "Нет такого свойства: bar для класса: что бы ни было".

Как мне сделать следующий тест:

if (#test-here#) {
  use(foo.bar)
}
4b9b3361

Ответ 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 в частности, но почти в каждом динамическом языке, который я когда-либо использовал, идиоматический способ сделать это - просто сделать это и поймать исключение, если оно будет выбрано, и в обработчик исключений делает все, что вам нужно, чтобы разумно справляться с ситуацией.