2008-09-26 8 views
18

Estaba usando una enumeración en la que la constante era una clase. Necesitaba invocar un método en la constante pero no podía introducir una dependencia de tiempo de compilación y la enumeración no siempre estaba disponible en el tiempo de ejecución (parte de la instalación opcional). Por lo tanto, quería usar la reflexión.¿Cómo usar la reflexión de Java cuando el tipo enum es una clase?

Esto es fácil, pero no había usado el reflejo con enumeraciones antes.

La enumeración se veía algo como esto:

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; 
    } 

} 

¿Cuál es un ejemplo de invocación de un método de la constante utilizando la reflexión?

+0

Ha explicado su clase enum, pero ¿cuál es su pregunta? ¿Te estás preguntando cómo se verá el código para descubrir tu clase por reflexión? – qualidafial

Respuesta

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

¿Por qué necesita la llamada 'consts [0] .getClass()'? ¿No es esto por definición lo mismo que 'clz'? En otras palabras, ¿no es posible acceder a 'getDefaultValue' utilizando' clz.getDeclaredMethod() 'en lugar de' sub.getDeclaredMethod'? –

Cuestiones relacionadas