support config default classloader

This commit is contained in:
高铁
2016-03-16 10:46:37 +08:00
parent 0f0b9b144b
commit 9696dfd7d9
8 changed files with 37 additions and 11 deletions
@@ -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;
}
}
@@ -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);