diff --git a/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java b/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java index 24dd3d80c..13a7bc8f5 100644 --- a/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/EnumSimpledCoder.java @@ -1,94 +1,100 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.redkale.convert.ext; - -import java.lang.reflect.*; -import java.util.*; -import org.redkale.convert.*; -import org.redkale.util.RedkaleClassLoader; - -/** - * 枚举 的SimpledCoder实现 - * - *

- * 详情见: https://redkale.org - * - * @author zhangjx - * @param Reader输入的子类型 - * @param Writer输出的子类型 - * @param Enum的子类 - */ -public final class EnumSimpledCoder extends SimpledCoder { - - private final Encodeable valueEncoder; - - private final Map enumToValues; - - private final Map valueToEnums; - - public EnumSimpledCoder(final ConvertFactory factory, Class type) { - this.type = type; - ConvertEnumValue cev = type.getAnnotation(ConvertEnumValue.class); - if (cev == null) { - this.valueEncoder = null; - this.enumToValues = null; - this.valueToEnums = null; - } else { - try { - String fieldName = cev.value(); - Field field = type.getDeclaredField(fieldName); - RedkaleClassLoader.putReflectionField(fieldName, field); - char[] chs = fieldName.toCharArray(); - chs[0] = Character.toUpperCase(chs[0]); - String methodName = "get" + new String(chs); - Method method = type.getMethod(methodName); - RedkaleClassLoader.putReflectionMethod(methodName, method); - Map map1 = new HashMap<>(); - Map map2 = new HashMap<>(); - for (E e : type.getEnumConstants()) { - map1.put(e, method.invoke(e)); - map2.put(method.invoke(e).toString(), e); - } - this.valueEncoder = factory.loadEncoder(field.getType()); - this.enumToValues = map1; - this.valueToEnums = map2; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - @Override - public void convertTo(final W out, final E value) { - if (value == null) { - out.writeNull(); - } else if (valueEncoder != null) { - valueEncoder.convertTo(out, enumToValues.get(value)); - } else { - out.writeSmallString(value.toString()); - } - } - - @Override - @SuppressWarnings("unchecked") - public E convertFrom(final R in) { - String value = in.readSmallString(); - if (value == null) { - return null; - } - if (valueToEnums != null) { - return valueToEnums.get(value); - } else { - return (E) Enum.valueOf((Class) type, value); - } - } - - @Override - public Class getType() { - return (Class) type; - } - -} +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.convert.ext; + +import java.lang.reflect.*; +import java.util.*; +import org.redkale.convert.*; +import org.redkale.util.RedkaleClassLoader; + +/** + * 枚举 的SimpledCoder实现 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @param Reader输入的子类型 + * @param Writer输出的子类型 + * @param Enum的子类 + */ +public final class EnumSimpledCoder extends SimpledCoder { + + private final Encodeable valueEncoder; + + private final Map enumToValues; + + private final Map valueToEnums; + + public EnumSimpledCoder(final ConvertFactory factory, Class type) { + this.type = type; + ConvertEnumValue cev = type.getAnnotation(ConvertEnumValue.class); + if (cev == null) { + this.valueEncoder = null; + this.enumToValues = null; + this.valueToEnums = null; + } else { + try { + String fieldName = cev.value(); + Field field = type.getDeclaredField(fieldName); + RedkaleClassLoader.putReflectionField(fieldName, field); + char[] chs = fieldName.toCharArray(); + chs[0] = Character.toUpperCase(chs[0]); + String methodName = "get" + new String(chs); + Method method = null; + try { + method = type.getMethod(methodName); + } catch (NoSuchMethodException | SecurityException me) { + method = type.getMethod(fieldName); + methodName = fieldName; + } + RedkaleClassLoader.putReflectionMethod(methodName, method); + Map map1 = new HashMap<>(); + Map map2 = new HashMap<>(); + for (E e : type.getEnumConstants()) { + map1.put(e, method.invoke(e)); + map2.put(method.invoke(e).toString(), e); + } + this.valueEncoder = factory.loadEncoder(field.getType()); + this.enumToValues = map1; + this.valueToEnums = map2; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void convertTo(final W out, final E value) { + if (value == null) { + out.writeNull(); + } else if (valueEncoder != null) { + valueEncoder.convertTo(out, enumToValues.get(value)); + } else { + out.writeSmallString(value.toString()); + } + } + + @Override + @SuppressWarnings("unchecked") + public E convertFrom(final R in) { + String value = in.readSmallString(); + if (value == null) { + return null; + } + if (valueToEnums != null) { + return valueToEnums.get(value); + } else { + return (E) Enum.valueOf((Class) type, value); + } + } + + @Override + public Class getType() { + return (Class) type; + } + +}