1 21 22 package org.armedbear.lisp; 23 24 import java.io.DataInputStream ; 25 import java.io.File ; 26 import java.io.FileInputStream ; 27 import java.util.Collections ; 28 import java.util.HashSet ; 29 import java.util.Set ; 30 31 public class JavaClassLoader extends ClassLoader 32 { 33 private static final boolean isSableVM; 34 35 static { 36 String vm = System.getProperty("java.vm.name"); 37 if (vm != null && vm.equals("SableVM")) 38 isSableVM = true; 39 else 40 isSableVM = false; 41 } 42 43 private static JavaClassLoader persistentInstance; 44 45 private static Set packages = Collections.synchronizedSet(new HashSet ()); 46 47 public static JavaClassLoader getPersistentInstance() 48 { 49 return getPersistentInstance(null); 50 } 51 52 public static JavaClassLoader getPersistentInstance(String packageName) 53 { 54 if (persistentInstance == null) 55 persistentInstance = new JavaClassLoader(); 56 definePackage(packageName); 57 return persistentInstance; 58 } 59 60 private static void definePackage(String packageName) 61 { 62 if (packageName != null && !packages.contains(packageName)) { 63 persistentInstance.definePackage(packageName,"","1.0","","","1.0","",null); 64 packages.add(packageName); 65 } 66 } 67 68 69 protected Class loadClassFromFile(File file) 70 { 71 try { 72 long length = file.length(); 73 if (length < Integer.MAX_VALUE) { 74 byte[] classbytes = new byte[(int)length]; 75 DataInputStream in = 76 new DataInputStream (new FileInputStream (file)); 77 in.readFully(classbytes); 78 in.close(); 79 final String name; 80 if (isSableVM) { 82 String s = file.getName(); 83 int index = s.lastIndexOf('.'); 84 if (index >= 0) 85 s = s.substring(0, index); 86 name = "org.armedbear.lisp.".concat(s.replace('-', '_')); 87 } else 88 name = null; 89 Class c = defineClass(name, classbytes, 0, (int) length); 90 if (c != null) { 91 resolveClass(c); 92 return c; 93 } 94 } 95 } 96 catch (Throwable t) { 97 Debug.trace(t); 98 } 99 return null; 100 } 101 102 public Class loadClassFromByteArray(String className, byte[] classbytes) 103 { 104 try { 105 long length = classbytes.length; 106 if (length < Integer.MAX_VALUE) { 107 Class c = defineClass(className, classbytes, 0, (int) length); 108 if (c != null) { 109 resolveClass(c); 110 return c; 111 } 112 } 113 } 114 catch (LinkageError e) { 115 throw e; 116 } 117 catch (Throwable t) { 118 Debug.trace(t); 119 } 120 return null; 121 } 122 123 public Class loadClassFromByteArray(String className, byte[] bytes, 124 int offset, int length) 125 { 126 try { 127 Class c = defineClass(className, bytes, offset, length); 128 if (c != null) { 129 resolveClass(c); 130 return c; 131 } 132 } 133 catch (Throwable t) { 134 Debug.trace(t); 135 } 136 return null; 137 } 138 } 139 | Popular Tags |