web-dev-qa-db-ja.com

列挙型がクラスの場合、Javaリフレクションを使用する方法は?

定数がクラスである列挙型を使用していました。定数でメソッドを呼び出す必要がありましたが、コンパイル時の依存関係を導入できず、列挙型が実行時に常に使用できるとは限りませんでした(オプションのインストールの一部)。そのため、リフレクションを使いたかったのです。

これは簡単ですが、これまで列挙型でリフレクションを使用したことはありませんでした。

列挙型は次のようになりました。

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

}

リフレクションを使用して定数のメソッドを呼び出す例は何ですか?

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

}
39
David G