1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.bcel.util;
20
21 import java.io.ByteArrayInputStream;
22 import java.io.IOException;
23 import java.util.Hashtable;
24
25 import org.apache.bcel.Const;
26 import org.apache.bcel.classfile.ClassParser;
27 import org.apache.bcel.classfile.ConstantClass;
28 import org.apache.bcel.classfile.ConstantPool;
29 import org.apache.bcel.classfile.ConstantUtf8;
30 import org.apache.bcel.classfile.JavaClass;
31 import org.apache.bcel.classfile.Utility;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 @Deprecated
57 public class ClassLoader extends java.lang.ClassLoader {
58
59 private static final String BCEL_TOKEN = "$$BCEL$$";
60
61 public static final String[] DEFAULT_IGNORED_PACKAGES = {"java.", "javax.", "sun."};
62
63 private final Hashtable<String, Class<?>> classes = new Hashtable<>();
64
65 private final String[] ignoredPackages;
66 private Repository repository = SyntheticRepository.getInstance();
67
68
69
70
71 public ClassLoader() {
72 this(DEFAULT_IGNORED_PACKAGES);
73 }
74
75
76
77
78 public ClassLoader(final java.lang.ClassLoader deferTo) {
79 super(deferTo);
80 this.ignoredPackages = DEFAULT_IGNORED_PACKAGES;
81 this.repository = new ClassLoaderRepository(deferTo);
82 }
83
84
85
86
87
88 public ClassLoader(final java.lang.ClassLoader deferTo, final String[] ignoredPackages) {
89 this(ignoredPackages);
90 this.repository = new ClassLoaderRepository(deferTo);
91 }
92
93
94
95
96 public ClassLoader(final String[] ignoredPackages) {
97 this.ignoredPackages = ignoredPackages;
98 }
99
100
101
102
103
104
105
106
107
108
109
110
111
112 protected JavaClass createClass(final String className) {
113 final int index = className.indexOf(BCEL_TOKEN);
114 final String realName = className.substring(index + BCEL_TOKEN.length());
115 JavaClass clazz = null;
116 try {
117 final byte[] bytes = Utility.decode(realName, true);
118 final ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo");
119 clazz = parser.parse();
120 } catch (final IOException e) {
121 e.printStackTrace();
122 return null;
123 }
124
125 final ConstantPool cp = clazz.getConstantPool();
126 final ConstantClass cl = cp.getConstant(clazz.getClassNameIndex(), Const.CONSTANT_Class, ConstantClass.class);
127 final ConstantUtf8 name = cp.getConstantUtf8(cl.getNameIndex());
128 name.setBytes(Utility.packageToPath(className));
129 return clazz;
130 }
131
132 @Override
133 protected Class<?> loadClass(final String className, final boolean resolve) throws ClassNotFoundException {
134 Class<?> cl = null;
135
136
137
138 if ((cl = classes.get(className)) == null) {
139
140
141
142 for (final String ignoredPackage : ignoredPackages) {
143 if (className.startsWith(ignoredPackage)) {
144 cl = getParent().loadClass(className);
145 break;
146 }
147 }
148 if (cl == null) {
149 JavaClass clazz = null;
150
151
152
153 if (className.contains(BCEL_TOKEN)) {
154 clazz = createClass(className);
155 } else {
156 if ((clazz = repository.loadClass(className)) == null) {
157 throw new ClassNotFoundException(className);
158 }
159 clazz = modifyClass(clazz);
160 }
161 if (clazz != null) {
162 final byte[] bytes = clazz.getBytes();
163 cl = defineClass(className, bytes, 0, bytes.length);
164 } else {
165 cl = Class.forName(className);
166 }
167 }
168 if (resolve) {
169 resolveClass(cl);
170 }
171 }
172 classes.put(className, cl);
173 return cl;
174 }
175
176
177
178
179 protected JavaClass modifyClass(final JavaClass clazz) {
180 return clazz;
181 }
182 }