2012-01-04 6 views

Respuesta

0

no pude ver ninguna manera obvia para comprobar si hay una propiedad estática directamente, pero la comprobación de un método estático denominado getProperty es equivalente (creo)

def getStaticProperty(String name, Class clazz) { 
    def noArgs = [].toArray() 
    def methodName = 'get' + name[0].toUpperCase() 

    if (name.size() > 1) { 
    methodName += name[1..-1] 
    } 

    clazz.metaClass.getStaticMetaMethod(methodName, noArgs) 
} 

// class that will be used in tests 
class Foo { 

    static String x = 'bar' 
    static Integer num = 3 
} 

// tests 
assert getStaticProperty('x', Foo) 
assert getStaticProperty('num', Foo) 
assert getStaticProperty('noSuchProperty', Foo) == null 
5

no podía ver una manera de hacer esto groovy con excepción de usar la API de reflexión de Java:

import static java.lang.reflect.Modifier.isStatic 

class A { 
    static x = 1 
} 

def result = A.class.declaredFields.find { 
    it.name == 'x' && isStatic(it.modifiers) 
} 

println result == null ? 'class does not contain static X' : 
         'class contains static X' 
+0

¿Es un campo estático (Java) lo mismo que una propiedad estática (Groovy)? –

+0

Como este código funciona, diría que sí. – SteveD

+0

Definitivamente no. – Artefacto

3

Mira GrailsClassUtils.getStaticFieldValue - devuelve un Stati c valor de campo por nombre, nulo si no existe ninguna propiedad o no establecida. Usted puede mirar en aplicación si eso es útil

+0

Lamentablemente, el enlace ya no es válido. Redes un error 404. –

+0

Incluso si el enlace está muerto, aún puede usar GrailsClassUtils –

1
A.metaClass.hasProperty(A,'x') 

o

A.metaClass.respondsTo(A,'getX') 
0

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.

Cuestiones relacionadas