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 public ClassLoaderRepository(final java.lang.ClassLoader loader) {
43 this.loader = loader;
44 }
45
46
47
48
49 @Override
50 public void clear() {
51 loadedClasses.clear();
52 }
53
54
55
56
57 @Override
58 public JavaClass findClass(final String className) {
59 return loadedClasses.get(className);
60 }
61
62
63
64
65 @Override
66 public ClassPath getClassPath() {
67 return null;
68 }
69
70 @Override
71 public JavaClass loadClass(final Class<?> clazz) throws ClassNotFoundException {
72 return loadClass(clazz.getName());
73 }
74
75
76
77
78 @Override
79 public JavaClass loadClass(final String className) throws ClassNotFoundException {
80 final String classFile = Utility.packageToPath(className);
81 JavaClass RC = findClass(className);
82 if (RC != null) {
83 return RC;
84 }
85 try (InputStream is = loader.getResourceAsStream(classFile + JavaClass.EXTENSION)) {
86 if (is == null) {
87 throw new ClassNotFoundException(className + " not found.");
88 }
89 final ClassParser parser = new ClassParser(is, className);
90 RC = parser.parse();
91 storeClass(RC);
92 return RC;
93 } catch (final IOException e) {
94 throw new ClassNotFoundException(className + " not found: " + e, e);
95 }
96 }
97
98
99
100
101 @Override
102 public void removeClass(final JavaClass clazz) {
103 loadedClasses.remove(clazz.getClassName());
104 }
105
106
107
108
109 @Override
110 public void storeClass(final JavaClass clazz) {
111 loadedClasses.put(clazz.getClassName(), clazz);
112 clazz.setRepository(this);
113 }
114 }