From dc33dbae877e79c4f0479b2ae0f593087bb63c55 Mon Sep 17 00:00:00 2001 From: danieldingzju Date: Thu, 18 Feb 2016 13:25:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0cache=EF=BC=8C=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E6=80=A7=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deserializer/ASMDeserializerFactory.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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);