diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java index 413f50b8f..6d29bec9f 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java @@ -283,7 +283,7 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable { if (key == JSON.DEFAULT_TYPE_KEY && !isEnabled(Feature.DisableSpecialKeyDetect)) { String typeName = lexer.scanSymbol(symbolTable, '"'); - Class clazz = TypeUtils.loadClass(typeName); + Class clazz = TypeUtils.loadClass(typeName, config.getDefaultClassLoader()); if (clazz == null) { object.put(JSON.DEFAULT_TYPE_KEY, typeName); diff --git a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java index 45588b78e..d36988b19 100644 --- a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java +++ b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java @@ -151,6 +151,8 @@ public class ParserConfig { private boolean asmEnable = !ASMUtils.isAndroid(); protected final SymbolTable symbolTable = new SymbolTable(); + + protected ClassLoader defaultClassLoader; protected ASMDeserializerFactory asmFactory; @@ -668,4 +670,11 @@ public class ParserConfig { } } + public ClassLoader getDefaultClassLoader() { + return defaultClassLoader; + } + + public void setDefaultClassLoader(ClassLoader defaultClassLoader) { + this.defaultClassLoader = defaultClassLoader; + } } diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java index f44441196..cdbd81cbc 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java @@ -48,7 +48,7 @@ public abstract class AbstractDateDeserializer implements ObjectDeserializer { parser.accept(JSONToken.COLON); String typeName = lexer.stringVal(); - Class type = TypeUtils.loadClass(typeName); + Class type = TypeUtils.loadClass(typeName, parser.getConfig().getDefaultClassLoader()); if (type != null) { clazz = type; } diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ClassDerializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ClassDerializer.java index b8669827c..ee07aebb1 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ClassDerializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ClassDerializer.java @@ -30,7 +30,7 @@ public class ClassDerializer implements ObjectDeserializer { String className = lexer.stringVal(); lexer.nextToken(JSONToken.COMMA); - return (T) TypeUtils.loadClass(className); + return (T) TypeUtils.loadClass(className, parser.getConfig().getDefaultClassLoader()); } public int getFastMatchToken() { diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java index 9a3b206bd..e8ea01034 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java @@ -312,7 +312,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { continue; } - Class userType = TypeUtils.loadClass(typeName); + Class userType = TypeUtils.loadClass(typeName, parser.getConfig().getDefaultClassLoader()); ObjectDeserializer deserizer = parser.getConfig().getDeserializer(userType); return (T) deserizer.deserialze(parser, userType, fieldName); } else { diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java index 6ee0d6026..5d36ae27d 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java @@ -130,7 +130,7 @@ public class MapDeserializer implements ObjectDeserializer { if (key == JSON.DEFAULT_TYPE_KEY && !parser.isEnabled(Feature.DisableSpecialKeyDetect)) { String typeName = lexer.scanSymbol(parser.getSymbolTable(), '"'); - Class clazz = TypeUtils.loadClass(typeName); + Class clazz = TypeUtils.loadClass(typeName, parser.getConfig().getDefaultClassLoader()); if (Map.class.isAssignableFrom(clazz) ) { lexer.nextToken(JSONToken.COMMA); diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java index 4d5012eee..24880cbc6 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java @@ -72,7 +72,7 @@ public class ThrowableDeserializer extends JavaBeanDeserializer { if (JSON.DEFAULT_TYPE_KEY.equals(key)) { if (lexer.token() == JSONToken.LITERAL_STRING) { String exClassName = lexer.stringVal(); - exClass = TypeUtils.loadClass(exClassName); + exClass = TypeUtils.loadClass(exClassName, parser.getConfig().getDefaultClassLoader()); } else { throw new JSONException("syntax error"); } diff --git a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java index 7d3bf8348..59383bc35 100755 --- a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java @@ -971,6 +971,10 @@ public class TypeUtils { } public static Class loadClass(String className) { + return loadClass(className, null); + } + + public static Class loadClass(String className, ClassLoader classLoader) { if (className == null || className.length() == 0) { return null; } @@ -982,20 +986,33 @@ public class TypeUtils { } if (className.charAt(0) == '[') { - Class componentType = loadClass(className.substring(1)); + Class componentType = loadClass(className.substring(1), classLoader); return Array.newInstance(componentType, 0).getClass(); } if (className.startsWith("L") && className.endsWith(";")) { String newClassName = className.substring(1, className.length() - 1); - return loadClass(newClassName); + return loadClass(newClassName, classLoader); + } + + try { + if (classLoader != null) { + clazz = classLoader.loadClass(className); + + addClassMapping(className, clazz); + + return clazz; + } + } catch (Throwable e) { + e.printStackTrace(); + // skip } try { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - if (classLoader != null) { - clazz = classLoader.loadClass(className); + if (contextClassLoader != null) { + clazz = contextClassLoader.loadClass(className); addClassMapping(className, clazz);