Ho un codice che sta impostando i valori su un oggetto usando i suoi metodi setter. Uno dei setter prende un tipo Enum come parametro del metodo. Il codice simile a questa:Come convertire String in enum value quando enum type reference è una classe <?>?
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;
La domanda è: cosa mettere nel metodo convertToEnum
. So che potrei "forzare la forza" iterando le costanti di enum (oi campi) dell'oggetto type
, facendo corrispondere il valore. Sto trascurando un modo più semplice di farlo usando Reflection? (Ho esaminato diversi esempi, ma non ho trovato nessuno in cui l'enum fosse noto solo tramite Class).
Grazie, devo aver sbagliato il cast quando l'ho provato per la prima volta. Questa è la soluzione corretta. Sfortunatamente, dopo aver provato questo, ho scoperto che ho bisogno di fare una corrispondenza insensibile alle maiuscole e minuscole, che 'Enum.valueOf()' non farà. Quindi torniamo all'approccio della forza bruta ... –
Quel caso è orribile. 'type' non è' Enum.class'. In ogni caso, 'asSubclass' è meglio di un cast di hack. –
@ TomHawtin-tackline: l'utilizzo di 'asSubclass' mi dà gli avvisi del compilatore. 'Class estende Enum> enumClass = type.asSubclass (Enum.class); Enum > convertedValue = Enum.valueOf (enumClass, "Value1"); 'sia per Raw Type che Invocation non verificato. Quindi non sono sicuro di vedere come sia migliore. –