2014-09-19 185 views
1

我已經看到許多StackOverflow帖子關於如何動態獲取枚舉的值,因爲你知道編譯時Enum類,但我試圖動態加載枚舉類和枚舉值,我沒有看到如何做到這一點。動態加載Java枚舉類和枚舉常量

我試圖做這樣的事情:

public interface Config { 
    public ConfigValue getConfigValue(); 
} 

public enum AwsConfig implements Config { 
    ACCESS_KEY_ID(new ConfigValue(...)), 
    API_URL(new ConfigValue(...)) 
    ... 
    public static String getName() { return "AwsConfig"; } 
    ... 
} 

public enum PaginatorConfig implements Config { 
    DEFAULT_PAGE_SIZE(new ConfigValue(...)), 
    ... 
    public static String getName() { return "PaginatorConfig"; } 
    ... 
} 

public void myMethod(ConfigValue configValue) { 
    String enumClassName = configValue.getName(); 
    String enumConstantKeyName = configValue.getKey(); 

    // I now have the enum's class name as enumClassName 
    // I now have the enum constant's name as enumConstantKeyName 
    // How can I dynamically get the enum constant's configValue based on the enumClassName and enumConstantKeyName? 

    // I know I can get the value dynamically if I know the Enum constant... 
    ConfigValue configValue = AwsConfig.valueOf("API_URL") 

    // But I wish I could do something like this... 
    ConfigValue configValue = Enum.valueOf("AwsConfig", "API_URL"); 
} 
+0

所以你想使用反射? – msrd0 2014-09-19 16:48:34

回答

4

如果你知道(或可以找出)你想從裝載值枚舉的完全合格的類名,你可以做這個:

String enumClassName = "com.mycompany.MyEnum"; 
String enumConstant = "MyValue"; 

Class enumClass = Class.forName(enumClassName); 
Object enumValue = Enum.valueOf(enumClass, enumConstant); 

assert enumValue == MyEnum.MyValue; // passes 
+0

謝謝,@Dan Vinton! 'Class.forName'是我所需要的。出於某種原因,我有一個心理障礙,我不能用普通的舊反射來枚舉Enum,所以這解決了我的問題。 – 2014-09-19 18:11:08

-1

你可以使用反射。這裏是一個簡短的例子:

public class Test { 

    public enum TestEnum { 

     MyEnumValue1, 

     MyEnumValue2; 
    } 

    public static void main(String[] args) { 
     try { 
      Object enumValue = getEnumValue("test.Test$TestEnum", "MyEnumValue2"); 
      System.out.println(enumValue.getClass().getName() + " = " 
        + enumValue); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static Object getEnumValue(String enumClassName, String enumValueName) 
      throws ClassNotFoundException, NoSuchMethodException, 
      SecurityException, IllegalAccessException, 
      IllegalArgumentException, InvocationTargetException { 
     Class<?> enumClass = Class.forName(enumClassName); 
     Method valueOfMethod = enumClass.getDeclaredMethod("valueOf", 
      String.class); 
     return valueOfMethod.invoke(null, enumValueName); 
    } 
} 
+0

建議編輯:'拋出ClassNotFoundException,NoSuchMethodException,...'拋出ReflectiveOperationException' – msrd0 2014-09-19 17:09:10

+0

感謝您的回答。儘管這個答案包含了我需要的行和概念('class.forName()'),我接受了上面的答案,因爲它更簡潔地解決了我的問題。 – 2014-09-19 18:12:37

+0

爲什麼在類Enum中有一個方法可以完全按照你想要的方法來進行反射呢? 'public static > T valueOf(Class enumType,String name)' – 2014-09-20 00:22:11