content: 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;
      }
  
  }
  