/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

  1. package com.alibaba.fastjson.util;
  2. import java.security.PrivilegedAction;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONArray;
  7. import com.alibaba.fastjson.JSONAware;
  8. import com.alibaba.fastjson.JSONException;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.alibaba.fastjson.JSONPath;
  11. import com.alibaba.fastjson.JSONPathException;
  12. import com.alibaba.fastjson.JSONReader;
  13. import com.alibaba.fastjson.JSONStreamAware;
  14. import com.alibaba.fastjson.JSONWriter;
  15. import com.alibaba.fastjson.TypeReference;
  16. import com.alibaba.fastjson.parser.DefaultJSONParser;
  17. import com.alibaba.fastjson.parser.Feature;
  18. import com.alibaba.fastjson.parser.JSONLexer;
  19. import com.alibaba.fastjson.parser.JSONLexerBase;
  20. import com.alibaba.fastjson.parser.JSONReaderScanner;
  21. import com.alibaba.fastjson.parser.JSONScanner;
  22. import com.alibaba.fastjson.parser.JSONToken;
  23. import com.alibaba.fastjson.parser.ParseContext;
  24. import com.alibaba.fastjson.parser.ParserConfig;
  25. import com.alibaba.fastjson.parser.SymbolTable;
  26. import com.alibaba.fastjson.parser.deserializer.AutowiredObjectDeserializer;
  27. import com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer;
  28. import com.alibaba.fastjson.parser.deserializer.ExtraProcessable;
  29. import com.alibaba.fastjson.parser.deserializer.ExtraProcessor;
  30. import com.alibaba.fastjson.parser.deserializer.ExtraTypeProvider;
  31. import com.alibaba.fastjson.parser.deserializer.FieldDeserializer;
  32. import com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer;
  33. import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
  34. import com.alibaba.fastjson.serializer.AfterFilter;
  35. import com.alibaba.fastjson.serializer.BeanContext;
  36. import com.alibaba.fastjson.serializer.BeforeFilter;
  37. import com.alibaba.fastjson.serializer.ContextObjectSerializer;
  38. import com.alibaba.fastjson.serializer.ContextValueFilter;
  39. import com.alibaba.fastjson.serializer.JSONSerializer;
  40. import com.alibaba.fastjson.serializer.JavaBeanSerializer;
  41. import com.alibaba.fastjson.serializer.LabelFilter;
  42. import com.alibaba.fastjson.serializer.Labels;
  43. import com.alibaba.fastjson.serializer.NameFilter;
  44. import com.alibaba.fastjson.serializer.ObjectSerializer;
  45. import com.alibaba.fastjson.serializer.PropertyFilter;
  46. import com.alibaba.fastjson.serializer.PropertyPreFilter;
  47. import com.alibaba.fastjson.serializer.SerialContext;
  48. import com.alibaba.fastjson.serializer.SerializeBeanInfo;
  49. import com.alibaba.fastjson.serializer.SerializeConfig;
  50. import com.alibaba.fastjson.serializer.SerializeFilter;
  51. import com.alibaba.fastjson.serializer.SerializeFilterable;
  52. import com.alibaba.fastjson.serializer.SerializeWriter;
  53. import com.alibaba.fastjson.serializer.SerializerFeature;
  54. import com.alibaba.fastjson.serializer.ValueFilter;
  55. public class ASMClassLoader extends ClassLoader {
  56. private static java.security.ProtectionDomain DOMAIN;
  57. private static Map<String, Class<?>> classMapping = new HashMap<String, Class<?>>();
  58. static {
  59. DOMAIN = (java.security.ProtectionDomain) java.security.AccessController.doPrivileged(new PrivilegedAction<Object>() {
  60. public Object run() {
  61. return ASMClassLoader.class.getProtectionDomain();
  62. }
  63. });
  64. Class<?>[] jsonClasses = new Class<?>[] {JSON.class,
  65. JSONObject.class,
  66. JSONArray.class,
  67. JSONPath.class,
  68. JSONAware.class,
  69. JSONException.class,
  70. JSONPathException.class,
  71. JSONReader.class,
  72. JSONStreamAware.class,
  73. JSONWriter.class,
  74. TypeReference.class,
  75. FieldInfo.class,
  76. TypeUtils.class,
  77. IOUtils.class,
  78. IdentityHashMap.class,
  79. ParameterizedTypeImpl.class,
  80. JavaBeanInfo.class,
  81. ObjectSerializer.class,
  82. JavaBeanSerializer.class,
  83. SerializeFilterable.class,
  84. SerializeBeanInfo.class,
  85. JSONSerializer.class,
  86. SerializeWriter.class,
  87. SerializeFilter.class,
  88. Labels.class,
  89. LabelFilter.class,
  90. ContextValueFilter.class,
  91. AfterFilter.class,
  92. BeforeFilter.class,
  93. NameFilter.class,
  94. PropertyFilter.class,
  95. PropertyPreFilter.class,
  96. ValueFilter.class,
  97. SerializerFeature.class,
  98. ContextObjectSerializer.class,
  99. SerialContext.class,
  100. SerializeConfig.class,
  101. JavaBeanDeserializer.class,
  102. ParserConfig.class,
  103. DefaultJSONParser.class,
  104. JSONLexer.class,
  105. JSONLexerBase.class,
  106. ParseContext.class,
  107. JSONToken.class,
  108. SymbolTable.class,
  109. Feature.class,
  110. JSONScanner.class,
  111. JSONReaderScanner.class,
  112. AutowiredObjectDeserializer.class,
  113. ObjectDeserializer.class,
  114. ExtraProcessor.class,
  115. ExtraProcessable.class,
  116. ExtraTypeProvider.class,
  117. BeanContext.class,
  118. FieldDeserializer.class,
  119. DefaultFieldDeserializer.class,
  120. };
  121. for (Class<?> clazz : jsonClasses) {
  122. classMapping.put(clazz.getName(), clazz);
  123. }
  124. }
  125. public ASMClassLoader(){
  126. super(getParentClassLoader());
  127. }
  128. public ASMClassLoader(ClassLoader parent){
  129. super (parent);
  130. }
  131. static ClassLoader getParentClassLoader() {
  132. ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
  133. if (contextClassLoader != null) {
  134. try {
  135. contextClassLoader.loadClass(JSON.class.getName());
  136. return contextClassLoader;
  137. } catch (ClassNotFoundException e) {
  138. // skip
  139. }
  140. }
  141. return JSON.class.getClassLoader();
  142. }
  143. protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
  144. Class<?> mappingClass = classMapping.get(name);
  145. if (mappingClass != null) {
  146. return mappingClass;
  147. }
  148. try {
  149. return super.loadClass(name, resolve);
  150. } catch (ClassNotFoundException e) {
  151. throw e;
  152. }
  153. }
  154. public Class<?> defineClassPublic(String name, byte[] b, int off, int len) throws ClassFormatError {
  155. Class<?> clazz = defineClass(name, b, off, len, DOMAIN);
  156. return clazz;
  157. }
  158. public boolean isExternalClass(Class<?> clazz) {
  159. ClassLoader classLoader = clazz.getClassLoader();
  160. if (classLoader == null) {
  161. return false;
  162. }
  163. ClassLoader current = this;
  164. while (current != null) {
  165. if (current == classLoader) {
  166. return false;
  167. }
  168. current = current.getParent();
  169. }
  170. return true;
  171. }
  172. }