2013-06-11 86 views
6

我有使用其setter方法設置對象的值的代碼。其中一個設置器將Enum類型作爲方法參數。該代碼看起來是這樣的:如何將字符串轉換爲枚舉值枚舉類型引用是一個類<?>?

String value = "EnumValue1"; 
    Method setter = getBeanWriteMethod("setMyEnumValue"); 
    Class<?> type = setter.getParameterTypes()[0]; 
    Object convertedValue = null; 
    if (type.isEnum()) { 
     convertedValue = convertToEnum(value, type); 
    } else { 
     convertedValue = ClassUtils.convertType(value, type); 
    } 
    return convertedValue; 

的問題是要放什麼東西在convertToEnum方法。我知道我可以通過遍歷type對象的枚舉常量(或字段)來匹配值來「蠻力」。我是否忽略了使用反射來做到這一點的更簡單的方法? (我看了幾個例子,但沒有找到任何地方的枚舉只知道通過類)。

回答

19

關閉我的頭頂:

Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type, value); 

這將字符串轉換爲枚舉類類型

編輯的一個枚舉常量:現在我有一臺電腦方便,我可以看到實際的工作。任一下面的情況下正確運行,沒有編譯器警告:

Enum<?> convertedValueA = Enum.valueOf(type, value); 
Enum<?> convertedValueB = Enum.valueOf(type.asSubclass(Enum.class), value); 

第二個呼叫asSubClass(),它會做一個運行時檢查以確保type是一些枚舉類,但valueOf()方法有可能作出這樣的檢查呢爲了正確工作。

下給了我一個編譯錯誤:

Enum<?> convertedValueC = Enum.valueOf((Class<? extends Enum <?>>)type, value); 

java: Foo.java:22: <T>valueOf(java.lang.Class<T>,java.lang.String) in java.lang.Enum cannot be applied to (java.lang.Class<capture#134 of ? extends java.lang.Enum<?>>,java.lang.String) 

鑄造通配符類型的複雜混淆了我,所以我可能已經嘗試了錯投。再加上它沒有運行時間效應這一事實意味着很容易弄錯並永遠不會發現。

+0

謝謝,當我第一次嘗試時,我一定得到了錯誤。這是正確的解決方案。不幸的是,在嘗試這些之後,我發現我需要做一個不區分大小寫的匹配,而Enum.valueOf()不會這樣做。所以回到蠻力的方法... –

+0

這種情況是可怕的。 'type'不是'Enum.class'。無論如何,'asSubclass'比黑客演員要好。 –

+0

@ TomHawtin-tackline:使用asSubclass給我編譯警告。 '類<?擴展枚舉> enumClass = type.asSubclass(Enum.class); Enum convertedValue = Enum.valueOf(enumClass,「Value1」);'對於Raw Type和Unvhecked Invocation。所以我不確定我看到那樣更好。 –

1
Enum.valueOf(yrEnum, myString) 

返回枚舉,其中myString是所需的枚舉實例的名稱。 而yrEnum.values()返回所有不同的可能枚舉實例的數組。

+0

與以往的,需要投以類來完成這項工作。 –

4

您可以使用

Class enumType = .... 
String name = .... 

Enum e = Enum.valueOf(enumType, name); 

例如

import java.lang.annotation.*; 

public class Main { 
    public static void main(String[] args) { 
     Class enumType = RetentionPolicy.class; 
     String name = "SOURCE"; 

     Enum e = Enum.valueOf(enumType, name); 
     System.out.println(e); 
    } 
} 

打印

SOURCE 
+0

這需要阿德里安放在上面的演員陣容。 –

+0

@SamGoldberg這是一個原始類型。所以我認爲它會奏效。非常糟糕。 –

+0

@ TomHawtin-tackline:我無法在沒有演員的情況下編譯它。 –