aoqi@0: import java.io.ByteArrayInputStream; aoqi@0: import java.io.FileInputStream; aoqi@0: public class Loader2 extends ClassLoader { aoqi@0: int _recur; aoqi@0: public void print( String msg ) { aoqi@0: for( int i=0; i<_recur; i++ ) aoqi@0: System.out.print(" "); aoqi@0: System.out.println(">>Loader2>> "+msg); aoqi@0: } aoqi@0: aoqi@0: protected Class findClass2(String name) throws ClassNotFoundException { aoqi@0: print("Fetching the implementation of "+name); aoqi@0: int old = _recur; aoqi@0: try { aoqi@0: FileInputStream fi = new FileInputStream(name+".impl2"); aoqi@0: byte result[] = new byte[fi.available()]; aoqi@0: fi.read(result); aoqi@0: aoqi@0: print("DefineClass1 on "+name); aoqi@0: _recur++; aoqi@0: Class clazz = defineClass(name, result, 0, result.length); aoqi@0: _recur = old; aoqi@0: print("Returning newly loaded class."); aoqi@0: return clazz; aoqi@0: } catch (Exception e) { aoqi@0: _recur = old; aoqi@0: print("Not found on disk."); aoqi@0: // If we caught an exception, either the class was not found or aoqi@0: // it was unreadable by our process. aoqi@0: return null; aoqi@0: //throw new ClassNotFoundException(e.toString()); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { aoqi@0: // Attempt a disk load first aoqi@0: Class c = findClass2(name); aoqi@0: if( c == null ) { aoqi@0: // check if the class has already been loaded aoqi@0: print("Checking for prior loaded class "+name); aoqi@0: c = findLoadedClass(name); aoqi@0: print("Letting super-loader load "+name); aoqi@0: int old = _recur; aoqi@0: _recur++; aoqi@0: c = super.loadClass(name, false); aoqi@0: _recur=old; aoqi@0: } aoqi@0: if (resolve) { print("Resolving class "+name); resolveClass(c); } aoqi@0: print("Returning clazz "+c.getClassLoader()+":"+name); aoqi@0: return c; aoqi@0: } aoqi@0: }