mirror of
https://github.com/alibaba/fastjson.git
synced 2026-10-29 14:10:25 +08:00
support config default classloader
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user