/src/main/java/com/alibaba/fastjson/util/ASMClassLoader.java
https://github.com/alibaba/fastjson · Java · 198 lines · 171 code · 26 blank · 1 comment · 11 complexity · 024d35e3a88655097efea03cea51c9ec MD5 · raw file
- 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;
- }
- }