2008-09-26 16 views
18

J'utilisais une énumération dans laquelle la constante était une classe. J'avais besoin d'invoquer une méthode sur la constante mais je ne pouvais pas introduire une dépendance de temps de compilation et l'énumération n'était pas toujours disponible à l'exécution (partie de l'installation optionnelle). Par conséquent, je voulais utiliser la réflexion.Comment utiliser la réflexion Java lorsque le type enum est une classe?

C'est facile, mais je n'avais pas utilisé de réflexion avec des énumérations auparavant.

ENUM avait l'air quelque chose comme ceci:

public enum PropertyEnum { 

    SYSTEM_PROPERTY_ONE("property.one.name", "property.one.value"), 

    SYSTEM_PROPERTY_TWO("property.two.name", "property.two.value"); 

    private String name; 

    private String defaultValue; 

    PropertyEnum(String name) { 
    this.name = name; 
    } 

    PropertyEnum(String name, String value) { 
    this.name = name; 
    this.defaultValue = value; 
    } 

    public String getName() { 
    return name; 
    } 

    public String getValue() { 
    return System.getProperty(name); 
    } 

    public String getDefaultValue() { 
    return defaultValue; 
    } 

} 

Qu'est-ce qu'un exemple d'invoquer une méthode de la réflexion à l'aide constante?

+0

Vous avez expliqué votre classe enum, mais quelle est votre question? Vous vous demandez à quoi ressemblera le code pour découvrir votre classe par réflexion? – qualidafial

Répondre

38
import java.lang.reflect.Method; 

class EnumReflection 
{ 

    public static void main(String[] args) 
    throws Exception 
    { 
    Class<?> clz = Class.forName("test.PropertyEnum"); 
    /* Use method added in Java 1.5. */ 
    Object[] consts = clz.getEnumConstants(); 
    /* Enum constants are in order of declaration. */ 
    Class<?> sub = consts[0].getClass(); 
    Method mth = sub.getDeclaredMethod("getDefaultValue"); 
    String val = (String) mth.invoke(consts[0]); 
    /* Prove it worked. */ 
    System.out.println("getDefaultValue " + 
     val.equals(PropertyEnum.SYSTEM_PROPERTY_ONE.getDefaultValue())); 
    } 

} 
+0

Pourquoi avez-vous besoin de l'appel 'consts [0] .getClass()'? N'est-ce pas par définition la même chose que 'clz'? En d'autres termes, n'est-il pas possible d'accéder à 'getDefaultValue' en utilisant' clz.getDeclaredMethod() 'au lieu de' sub.getDeclaredMethod'? –