Как проверить, есть ли у объекта определенное свойство?

Я хочу использовать либо значение ожидаемого свойства, либо указанное значение по умолчанию. Как добиться этого в заводной?

Позволять's посмотрите на пример:

def printName(object) {
   //if object has initialized property 'name' - print 'name', otherwise print ToString
   if (objectname && object.name) {
      print object.name
   } else {
      print object
   }
}

Ответы на вопрос(4)

class Foo {
    def name = "Mozart"
}

def f = new Foo()

Object.metaClass.getPropertyOrElse = { prop, defaultVal ->
    delegate.hasProperty(prop) ? delegate."${prop}" : defaultVal
}

assert "Mozart" == f.getPropertyOrElse("name", "")
assert "Salzburg" == f.getPropertyOrElse("city", "Salzburg")

Предполагая вашobject класс Groovy, вы можете использоватьhasProperty в объектеmetaClass вот так:

def printName( o ) {
  if( o.metaClass.hasProperty( o, 'name' ) && o.name ) {
    println "Printing Name : $o.name"
  }
  else {
    println o
  }
}

Итак, тогда даны два занятия:

class Named {
  String name
  int age

  String toString() { "toString Named:$name/$age" }
}

class Unnamed {
  int age

  String toString() { "toString Unnamed:$age" }
}

Вы можете создать их экземпляр и протестировать:

def a = new Named( name: 'tim', age: 21 )
def b = new Unnamed( age: 32 )

printName( a )
printName( b )

Который должен вывести:

Printing Name : tim
toString Unnamed:32
 Alexander Suraphel27 мая 2014 г., 13:36
Спасибо Тим, почему я должен получить доступ к свойству класса из метакласса, а не обычным способом (т.е. object.hasProperty ('название'))?

что у объекта есть какое-то свойство, я просто проверяю следующее:

assertNotNull(myObject.hasProperty('myProperty').name)

ЕслиmyObject не имеетmyProperty утверждение потерпит неудачу с исключением нулевого указателя:

java.lang.NullPointerException: Cannot get property 'name' on null object
Решение Вопроса

Ты можешь использоватьhasProperty, Пример:

if (object.hasProperty('name') && object.name) {
    println object.name
} else {
    println object
}

Если ты'Используя переменную для имени свойства, вы можете использовать это:

String propName = 'name'
if (object.hasProperty(propName) && object."$propName") {
    ...
}
 Justin Piper18 окт. 2012 г., 05:23
#hasProperty на самом деле возвращаетMetaPropertyтак что вы также можете сделать что-то вродеobject.hasProperty(propName)?.getProperty(object) ?: defval
 tim_yates17 окт. 2012 г., 17:25
+1 Лучше, чем мой ... Я не долженя начал с метакласса ;-)
 Yazad17 февр. 2017 г., 20:00
Решение, предоставленное здесь и в других ответах, неРазличать атрибут, который отсутствует, и атрибут, имеющий значение null, поскольку, как указал @TimurMilovanov, он возвращает значение null для динамических полей, как в случае Expando.
 Timur Milovanov09 дек. 2016 г., 10:44
... и есть некоторое несоответствие в groovyDoc (groovy-2.4.7):Описание начинается сReturns true of the implementing MetaClass has a property of the given name   Возвращает обозначаетThe found MetaProperty or null if it doesn't exist что является правдой

Ваш ответ на вопрос