Question

J'utilisais une énumération dans laquelle la constante était une classe. J'avais besoin d'appeler une méthode sur la constante, mais je ne pouvais pas introduire de dépendance à la compilation et l'énumération n'était pas toujours disponible au moment de l'exécution (élément de l'installation facultative). Par conséquent, je voulais utiliser la réflexion.

C’est facile, mais je n’avais jamais utilisé la réflexion avec des énumérations auparavant.

L'énumération ressemblait à 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'appeler une méthode de la constante en utilisant la réflexion?

Était-ce utile?

La solution

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top