Source code: org/apache/bcel/util/ClassLoaderRepository.java
1 /*
2 * Copyright 2000-2004 The Apache Software Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17 package org.apache.bcel.util;
18
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.HashMap;
22 import java.util.Map;
23 import org.apache.bcel.classfile.ClassParser;
24 import org.apache.bcel.classfile.JavaClass;
25
26 /**
27 * The repository maintains information about which classes have
28 * been loaded.
29 *
30 * It loads its data from the ClassLoader implementation
31 * passed into its constructor.
32 *
33 * @see org.apache.bcel.Repository
34 *
35 * @version $Id: ClassLoaderRepository.java 386056 2006-03-15 11:31:56Z tcurdt $
36 * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
37 * @author David Dixon-Peugh
38 */
39 public class ClassLoaderRepository implements Repository {
40
41 private java.lang.ClassLoader loader;
42 private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS
43
44
45 public ClassLoaderRepository(java.lang.ClassLoader loader) {
46 this.loader = loader;
47 }
48
49
50 /**
51 * Store a new JavaClass into this Repository.
52 */
53 public void storeClass( JavaClass clazz ) {
54 loadedClasses.put(clazz.getClassName(), clazz);
55 clazz.setRepository(this);
56 }
57
58
59 /**
60 * Remove class from repository
61 */
62 public void removeClass( JavaClass clazz ) {
63 loadedClasses.remove(clazz.getClassName());
64 }
65
66
67 /**
68 * Find an already defined JavaClass.
69 */
70 public JavaClass findClass( String className ) {
71 if (loadedClasses.containsKey(className)) {
72 return (JavaClass) loadedClasses.get(className);
73 } else {
74 return null;
75 }
76 }
77
78
79 /**
80 * Lookup a JavaClass object from the Class Name provided.
81 */
82 public JavaClass loadClass( String className ) throws ClassNotFoundException {
83 String classFile = className.replace('.', '/');
84 JavaClass RC = findClass(className);
85 if (RC != null) {
86 return RC;
87 }
88 try {
89 InputStream is = loader.getResourceAsStream(classFile + ".class");
90 if (is == null) {
91 throw new ClassNotFoundException(className + " not found.");
92 }
93 ClassParser parser = new ClassParser(is, className);
94 RC = parser.parse();
95 storeClass(RC);
96 return RC;
97 } catch (IOException e) {
98 throw new ClassNotFoundException(e.toString());
99 }
100 }
101
102
103 public JavaClass loadClass( Class clazz ) throws ClassNotFoundException {
104 return loadClass(clazz.getName());
105 }
106
107
108 /** Clear all entries from cache.
109 */
110 public void clear() {
111 loadedClasses.clear();
112 }
113
114
115 /*
116 * @return null
117 */
118 public ClassPath getClassPath() {
119 return null;
120 }
121 }