package org.nutz.castor.castor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.nutz.castor.Castor; import org.nutz.castor.FailToCastObjectException; import org.nutz.lang.Lang; @SuppressWarnings({"rawtypes"}) public class Number2Enum extends Castor<Number, Enum> { @Override public Enum cast(Number src, Class<?> toType, String... args) throws FailToCastObjectException { int v = src.intValue(); Enum o = null; // 首先试图用采用该类型的 fromInt 的静态方法 try { Method m = toType.getMethod("fromInt", int.class); if (Modifier.isStatic(m.getModifiers()) && toType.isAssignableFrom(m.getReturnType())) { o = (Enum) m.invoke(null, v); } } catch (Exception e) {} // 搞不定,则试图根据顺序号获取 if (null == o) try { for (Field field : toType.getFields()) { if (field.getType() == toType) { Enum em = (Enum) field.get(null); if (em.ordinal() == v) return em; } } throw Lang.makeThrow(FailToCastObjectException.class, "Can NO find enum value in [%s] by int value '%d'", toType.getName(), src.intValue()); } catch (Exception e2) { throw Lang.wrapThrow(e2, FailToCastObjectException.class); } return o; } }