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.IOException;
22 import java.io.InputStream;
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import org.apache.bcel.classfile.ClassParser;
27 import org.apache.bcel.classfile.JavaClass;
28 import org.apache.bcel.classfile.Utility;
29
30
31
32
33
34
35
36
37 public class ClassLoaderRepository implements Repository {
38
39 private final java.lang.ClassLoader loader;
40 private final Map<String, JavaClass> loadedClasses = new HashMap<>();
41
42
43
44
45
46
47 public ClassLoaderRepository(final java.lang.ClassLoader loader) {
48 this.loader = loader;
49 }
50
51
52
53
54 @Override
55 public void clear() {
56 loadedClasses.clear();
57 }
58
59
60
61
62 @Override
63 public JavaClass findClass(final String className) {
64 return loadedClasses.get(className);
65 }
66
67
68
69
70 @Override
71 public ClassPath getClassPath() {
72 return null;
73 }
74
75 @Override
76 public JavaClass loadClass(final Class<?> clazz) throws ClassNotFoundException {
77 return loadClass(clazz.getName());
78 }
79
80
81
82
83 @Override
84 public JavaClass loadClass(final String className) throws ClassNotFoundException {
85 final String classFile = Utility.packageToPath(className);
86 JavaClass RC = findClass(className);
87 if (RC != null) {
88 return RC;
89 }
90 try (InputStream is = loader.getResourceAsStream(classFile + JavaClass.EXTENSION)) {
91 if (is == null) {
92 throw new ClassNotFoundException(className + " not found.");
93 }
94 final ClassParser parser = new ClassParser(is, className);
95 RC = parser.parse();
96 storeClass(RC);
97 return RC;
98 } catch (final IOException e) {
99 throw new ClassNotFoundException(className + " not found: " + e, e);
100 }
101 }
102
103
104
105
106 @Override
107 public void removeClass(final JavaClass clazz) {
108 loadedClasses.remove(clazz.getClassName());
109 }
110
111
112
113
114 @Override
115 public void storeClass(final JavaClass clazz) {
116 loadedClasses.put(clazz.getClassName(), clazz);
117 clazz.setRepository(this);
118 }
119 }