KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > clazzy > BaseClassLoader


1 package org.sapia.clazzy;
2
3 import java.security.SecureClassLoader JavaDoc;
4
5 /**
6  * This class overrides the <code>SecureClassLoader</code> class. It allows
7  * bypassing the delegation model, by which child classloaders are supposed to
8  * resolve classes by first delegating the lookup to their parent classloader.
9  * <p>
10  * Inheriting classes should override this class' <code>findClass(String)</code>
11  * method to support looking up classes from different sources. Accordingly,
12  * inherinting classes should also override this class' resource-related methods,
13  * such as <code>findResource()</code>.
14  *
15  * @author Yanick Duchesne
16  *
17  * <dl>
18  * <dt><b>Copyright: </b>
19  * <dd>Copyright &#169; 2002-2004 <a HREF="http://www.sapia-oss.org">Sapia Open
20  * Source Software </a>. All Rights Reserved.</dd>
21  * </dt>
22  * <dt><b>License: </b>
23  * <dd>Read the license.txt file of the jar or visit the <a
24  * HREF="http://www.sapia-oss.org/license.html">license page </a> at the Sapia
25  * OSS web site</dd>
26  * </dt>
27  * </dl>
28  */

29 public class BaseClassLoader extends SecureClassLoader JavaDoc {
30
31   private boolean _parentFirst = true;
32
33   public BaseClassLoader() {
34     super(Thread.currentThread().getContextClassLoader());
35   }
36
37   public BaseClassLoader(ClassLoader JavaDoc parent) {
38     super(parent);
39   }
40
41   /**
42    * @param parentFirst
43    * if <code>true</code>, indicates that this instance should ask
44    * its parent for the specified classes rather then looking them up
45    * itself (this is the delegation model suggested by Java's API).
46    * Defaults to <code>true</code>.
47    */

48   public void setParentFirst(boolean parentFirst) {
49     _parentFirst = parentFirst;
50   }
51   
52   /**
53    * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)
54    */

55   public synchronized Class JavaDoc loadClass(String JavaDoc name, boolean resolve)
56       throws ClassNotFoundException JavaDoc {
57     Class JavaDoc clazz = findLoadedClass(name);
58     if(clazz == null) {
59       if(_parentFirst) {
60         clazz = loadClassFromParent(name);
61         if(clazz != null) {
62           if(resolve) {
63             super.resolveClass(clazz);
64           }
65           return clazz;
66         }
67       }
68       try {
69         clazz = findClass(name);
70       } catch(ClassNotFoundException JavaDoc e) {
71         //noop;
72
}
73       if(clazz == null && !_parentFirst) {
74         clazz = loadClassFromParent(name);
75         if(clazz != null) {
76           if(resolve) {
77             super.resolveClass(clazz);
78           }
79           return clazz;
80         }
81       }
82     }
83     if(clazz == null) {
84       throw new ClassNotFoundException JavaDoc(name);
85     }
86     if(resolve) {
87       super.resolveClass(clazz);
88     }
89     return clazz;
90   }
91
92   private Class JavaDoc loadClassFromParent(String JavaDoc name) {
93     ClassLoader JavaDoc parent = getParent();
94     if(parent != null) {
95       try {
96         return parent.loadClass(name);
97       } catch(ClassNotFoundException JavaDoc e) {
98         return null;
99       }
100     }
101     return null;
102   }
103 }
104
Popular Tags