添加cache,解决并发问题,提高性能。

This commit is contained in:
danieldingzju
2016-02-18 13:25:33 +08:00
parent ee1a6354e7
commit dc33dbae87
@@ -41,6 +41,8 @@ public class ASMDeserializerFactory implements Opcodes {
private final ASMClassLoader classLoader;
private final Map<String, Class> classMap = new HashMap<String, Class>();
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);