1 package gnu.bytecode; 2 import java.util.Hashtable ; 3 import java.net.URL ; 4 5 8 9 public class ArrayClassLoader extends ClassLoader 10 { 11 Hashtable map = new Hashtable (100); 12 13 14 URL context; 15 16 public ArrayClassLoader () 17 { 18 } 19 20 21 public URL getResourceContext () { return context; } 22 23 24 public void setResourceContext (URL context) { this.context = context; } 25 26 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 [] 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 clas) 41 { 42 map.put(clas.getName(), clas); 43 } 44 45 public void addClass(String name, byte[] bytes) 46 { 47 map.put(name, bytes); 48 } 49 50 public void addClass (ClassType ctype) 51 throws java.io.IOException 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 findResource(String name) 60 { 61 if (context != null) 62 { 63 try 64 { 65 URL url = new URL (context, name); 66 url.openConnection().connect(); 67 return url; 68 } 69 catch (Throwable ex) 70 { 71 } 73 } 74 return super.findResource(name); 75 } 76 77 public Class loadClass (String name, boolean resolve) 78 throws ClassNotFoundException 79 { 80 Object r = map.get(name); 81 Class 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 ) r; 99 } 100 } 101 else 102 clas = (Class ) r; 103 if (resolve && clas != null) 104 resolveClass (clas); 105 return clas; 106 } 107 } 108 | Popular Tags |