package com.alibaba.fastjson.util; import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONAware; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.alibaba.fastjson.JSONPathException; import com.alibaba.fastjson.JSONReader; import com.alibaba.fastjson.JSONStreamAware; import com.alibaba.fastjson.JSONWriter; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.JSONLexer; import com.alibaba.fastjson.parser.JSONLexerBase; import com.alibaba.fastjson.parser.JSONReaderScanner; import com.alibaba.fastjson.parser.JSONScanner; import com.alibaba.fastjson.parser.JSONToken; import com.alibaba.fastjson.parser.ParseContext; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.SymbolTable; import com.alibaba.fastjson.parser.deserializer.AutowiredObjectDeserializer; import com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer; import com.alibaba.fastjson.parser.deserializer.ExtraProcessable; import com.alibaba.fastjson.parser.deserializer.ExtraProcessor; import com.alibaba.fastjson.parser.deserializer.ExtraTypeProvider; import com.alibaba.fastjson.parser.deserializer.FieldDeserializer; import com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.serializer.AfterFilter; import com.alibaba.fastjson.serializer.BeanContext; import com.alibaba.fastjson.serializer.BeforeFilter; import com.alibaba.fastjson.serializer.ContextObjectSerializer; import com.alibaba.fastjson.serializer.ContextValueFilter; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.JavaBeanSerializer; import com.alibaba.fastjson.serializer.LabelFilter; import com.alibaba.fastjson.serializer.Labels; import com.alibaba.fastjson.serializer.NameFilter; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.PropertyFilter; import com.alibaba.fastjson.serializer.PropertyPreFilter; import com.alibaba.fastjson.serializer.SerialContext; import com.alibaba.fastjson.serializer.SerializeBeanInfo; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializeFilter; import com.alibaba.fastjson.serializer.SerializeFilterable; import com.alibaba.fastjson.serializer.SerializeWriter; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ValueFilter; public class ASMClassLoader extends ClassLoader { private static java.security.ProtectionDomain DOMAIN; private static Map<String, Class<?>> classMapping = new HashMap<String, Class<?>>(); static { DOMAIN = (java.security.ProtectionDomain) java.security.AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { return ASMClassLoader.class.getProtectionDomain(); } }); Class<?>[] jsonClasses = new Class<?>[] {JSON.class, JSONObject.class, JSONArray.class, JSONPath.class, JSONAware.class, JSONException.class, JSONPathException.class, JSONReader.class, JSONStreamAware.class, JSONWriter.class, TypeReference.class, FieldInfo.class, TypeUtils.class, IOUtils.class, IdentityHashMap.class, ParameterizedTypeImpl.class, JavaBeanInfo.class, ObjectSerializer.class, JavaBeanSerializer.class, SerializeFilterable.class, SerializeBeanInfo.class, JSONSerializer.class, SerializeWriter.class, SerializeFilter.class, Labels.class, LabelFilter.class, ContextValueFilter.class, AfterFilter.class, BeforeFilter.class, NameFilter.class, PropertyFilter.class, PropertyPreFilter.class, ValueFilter.class, SerializerFeature.class, ContextObjectSerializer.class, SerialContext.class, SerializeConfig.class, JavaBeanDeserializer.class, ParserConfig.class, DefaultJSONParser.class, JSONLexer.class, JSONLexerBase.class, ParseContext.class, JSONToken.class, SymbolTable.class, Feature.class, JSONScanner.class, JSONReaderScanner.class, AutowiredObjectDeserializer.class, ObjectDeserializer.class, ExtraProcessor.class, ExtraProcessable.class, ExtraTypeProvider.class, BeanContext.class, FieldDeserializer.class, DefaultFieldDeserializer.class, }; for (Class<?> clazz : jsonClasses) { classMapping.put(clazz.getName(), clazz); } } public ASMClassLoader(){ super(getParentClassLoader()); } public ASMClassLoader(ClassLoader parent){ super (parent); } static ClassLoader getParentClassLoader() { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if (contextClassLoader != null) { try { contextClassLoader.loadClass(JSON.class.getName()); return contextClassLoader; } catch (ClassNotFoundException e) { // skip } } return JSON.class.getClassLoader(); } protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> mappingClass = classMapping.get(name); if (mappingClass != null) { return mappingClass; } try { return super.loadClass(name, resolve); } catch (ClassNotFoundException e) { throw e; } } public Class<?> defineClassPublic(String name, byte[] b, int off, int len) throws ClassFormatError { Class<?> clazz = defineClass(name, b, off, len, DOMAIN); return clazz; } public boolean isExternalClass(Class<?> clazz) { ClassLoader classLoader = clazz.getClassLoader(); if (classLoader == null) { return false; } ClassLoader current = this; while (current != null) { if (current == classLoader) { return false; } current = current.getParent(); } return true; } }