KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > bytecode > ArrayClassLoader


1 package gnu.bytecode;
2 import java.util.Hashtable JavaDoc;
3 import java.net.URL JavaDoc;
4
5 /** Load classes from a set of byte arrays.
6  * @author Per Bothner
7  */

8
9 public class ArrayClassLoader extends ClassLoader JavaDoc
10 {
11   Hashtable JavaDoc map = new Hashtable JavaDoc(100);
12
13   /** If non-null, context to use for finding resources. */
14   URL JavaDoc context;
15
16   public ArrayClassLoader ()
17   {
18   }
19
20   /** Get base URL to use for finding resources, or null if none is set. */
21   public URL JavaDoc getResourceContext () { return context; }
22
23   /** Set base URL to use for finding resources. */
24   public void setResourceContext (URL JavaDoc context) { this.context = context; }
25
26   /** Load classes from the given byte arrays.
27     By convention, the classes we manage are named "lambda"+<INTEGER>. */

28   public ArrayClassLoader (byte[][] classBytes)
29   {
30     for (int i = classBytes.length; --i >= 0; )
31       addClass("lambda" + i, classBytes[i]);
32   }
33
34   public ArrayClassLoader (String JavaDoc[] classNames, byte[][] classBytes)
35   {
36     for (int i = classBytes.length; --i >= 0; )
37       addClass(classNames[i], classBytes[i]);
38   }
39
40   public void addClass(Class JavaDoc clas)
41   {
42     map.put(clas.getName(), clas);
43   }
44
45   public void addClass(String JavaDoc name, byte[] bytes)
46   {
47     map.put(name, bytes);
48   }
49
50   public void addClass (ClassType ctype)
51     throws java.io.IOException JavaDoc
52   {
53     if ((ctype.flags & ClassType.EXISTING_CLASS) != 0)
54       addClass(ctype. getReflectClass());
55     else
56       addClass(ctype.getName(), ctype.writeToArray());
57   }
58
59   protected URL JavaDoc findResource(String JavaDoc name)
60   {
61     if (context != null)
62       {
63         try
64           {
65             URL JavaDoc url = new URL JavaDoc(context, name);
66             url.openConnection().connect();
67             return url;
68           }
69         catch (Throwable JavaDoc ex)
70           {
71             // Fall through ...
72
}
73       }
74     return super.findResource(name);
75   }
76
77   public Class JavaDoc loadClass (String JavaDoc name, boolean resolve)
78        throws ClassNotFoundException JavaDoc
79   {
80     Object JavaDoc r = map.get(name);
81     Class JavaDoc clas;
82     if (r == null)
83       {
84     clas = Class.forName(name);
85       }
86     else if (r instanceof byte[])
87       {
88     synchronized (this)
89       {
90         r = map.get(name);
91         if (r instanceof byte[])
92           {
93         byte[] bytes = (byte[]) r;
94         clas = defineClass (name, bytes, 0, bytes.length);
95         map.put(name, clas);
96           }
97         else
98           clas = (Class JavaDoc) r;
99       }
100       }
101     else
102       clas = (Class JavaDoc) r;
103     if (resolve && clas != null)
104       resolveClass (clas);
105     return clas;
106   }
107 }
108
Popular Tags