diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java index b0d0d1c87..110222ffb 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java @@ -41,6 +41,8 @@ public class ASMDeserializerFactory implements Opcodes { private final ASMClassLoader classLoader; + private final Map classMap = new HashMap(); + private final AtomicLong seed = new AtomicLong(); public String getGenClassName(Class clazz) { @@ -104,7 +106,7 @@ public class ASMDeserializerFactory implements Opcodes { } } - Class exampleClass = classLoader.defineClassPublic(className, code, 0, code.length); + Class exampleClass = defineClassPublic(className, code, 0, code.length); Constructor constructor = exampleClass.getConstructor(ParserConfig.class, Class.class); Object instance = constructor.newInstance(config, clazz); @@ -112,6 +114,14 @@ public class ASMDeserializerFactory implements Opcodes { return (ObjectDeserializer) instance; } + private Class defineClassPublic(String name, byte[] b, int off, int len){ + if(classMap.containsKey(name)){ + return classMap.get(name); + } else { + return classLoader.defineClassPublic(name, b, off, len); + } + } + void _setFlag(MethodVisitor mw, Context context, int i) { String varName = "_asm_flag_" + (i / 32); @@ -1212,7 +1222,7 @@ public class ASMDeserializerFactory implements Opcodes { byte[] code = cw.toByteArray(); - Class exampleClass = classLoader.defineClassPublic(className, code, 0, code.length); + Class exampleClass = defineClassPublic(className, code, 0, code.length); Constructor constructor = exampleClass.getConstructor(ParserConfig.class, Class.class, FieldInfo.class); Object instance = constructor.newInstance(mapping, clazz, fieldInfo);