代码之家  ›  专栏  ›  技术社区  ›  David G

当枚举类型是类时,如何使用Java反射?

  •  21
  • David G  · 技术社区  · 17 年前

    我使用了一个枚举,其中常量是类。我需要在常量上调用一个方法,但无法引入编译时依赖关系,并且枚举在运行时并不总是可用(可选安装的一部分)。因此,我想用反思。

    这很容易,但我以前没有在枚举中使用反射。

    枚举看起来像这样:

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

    使用反射调用常量方法的示例是什么?

    1 回复  |  直到 17 年前
        1
  •  42
  •   erickson    17 年前
    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()));
      }
    
    }