A partir de 2017 y 2.4.x maravilloso, la mejor manera de comprobar parece ser la siguiente:
A.metaClass.getMetaProperty('x') != null
Se funciona tanto para propiedades estáticas como no estáticas, así como para propiedades definidas con solo getter y setter (pero no campo real), o por un campo sin getter o setter (por ejemplo, en una clase java). Puede inspeccionar MetaProperty devuelto para obtener más detalles si es necesario. Tenga en cuenta que una propiedad puede ser definida por un colocador solo por lo que no es legible. Entonces, si es importante, ajuste sus cheques en consecuencia.
Sin embargo, tenga en cuenta que este método no permite comprobar si la propiedad es estática.
sudhir answer es probablemente el segundo mejor, ya que su implementación se basa en getDeclaredFields y, como resultado, no encuentra propiedades definidas solo por getter y setter. También solo es útil si estás usando grails. También recupera el valor real, si está presente, que puede o no ser deseado.
Las respuestas de SteveD no funcionan. Sin embargo, se puede solucionar eliminando 'clase' antes de declarados Campos y agregando verificaciones para getters y setters. Así, lleno de verificación de la existencia de propiedad es la siguiente:
def hasProperty = { Class c, String propertyName ->
if (!propertyName)
return false;
String p2 = propertyName.substring(0, 1).toUpperCase()
if (propertyName.length()> 1)
p2 += propertyName.substring(1)
return c.declaredFields.find {
it.name == propertyName /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('get' + p2) /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('is' + p2) /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('set' + p2)/* && isStatic(it.modifiers) */
}
}
Tenga en cuenta que este método también comprueba que la propiedad es en realidad estática (basta con importar java.lang.reflect.Modifier.isStatic estático y controles isStatic descomentar). Igual que arriba, ten cuidado con las propiedades solo de instalador.
¿Es un campo estático (Java) lo mismo que una propiedad estática (Groovy)? –
Como este código funciona, diría que sí. – SteveD
Definitivamente no. – Artefacto