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