package org.test4j.json.encoder.object; import java.io.Writer; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.test4j.json.encoder.JSONEncoder; import org.test4j.json.encoder.object.spec.MethodEncoder; @SuppressWarnings("rawtypes") public abstract class SpecEncoder<T> extends JSONEncoder<T> { public SpecEncoder(Class clazz) { super(clazz); } @Override public boolean encode(T target, Writer writer, List<String> references) { try { boolean isNullOrRef = this.writerNullOrReference(target, writer, references, true); if (isNullOrRef) { return false; } else { this.encodeSpec(target, writer, references); return true; } } catch (Exception e) { throw this.wrapException(e); } } protected abstract void encodeSpec(T target, Writer writer, List<String> references) throws Exception; public static SpecEncoder isSpecPoJoEncoder(Class type) { if (type == Method.class) { return MethodEncoder.instance; } SpecEncoder encoder = SPEC_ENCODERS.get(type); return encoder; } private final static Map<Class, SpecEncoder> SPEC_ENCODERS = new HashMap<Class, SpecEncoder>(); /** * 添加特殊类型的json编码器 * * @param type * @param encoder */ public static void addSpecEncoder(Class type, SpecEncoder encoder) { SPEC_ENCODERS.put(type, encoder); } }