1715
|
1 import java.io.ByteArrayInputStream;
|
|
2 import java.io.FileInputStream;
|
|
3 public class Loader2 extends ClassLoader {
|
|
4 int _recur;
|
|
5 public void print( String msg ) {
|
|
6 for( int i=0; i<_recur; i++ )
|
|
7 System.out.print(" ");
|
|
8 System.out.println(">>Loader2>> "+msg);
|
|
9 }
|
|
10
|
|
11 protected Class findClass2(String name) throws ClassNotFoundException {
|
|
12 print("Fetching the implementation of "+name);
|
|
13 int old = _recur;
|
|
14 try {
|
|
15 FileInputStream fi = new FileInputStream(name+".impl2");
|
|
16 byte result[] = new byte[fi.available()];
|
|
17 fi.read(result);
|
|
18
|
|
19 print("DefineClass1 on "+name);
|
|
20 _recur++;
|
|
21 Class clazz = defineClass(name, result, 0, result.length);
|
|
22 _recur = old;
|
|
23 print("Returning newly loaded class.");
|
|
24 return clazz;
|
|
25 } catch (Exception e) {
|
|
26 _recur = old;
|
|
27 print("Not found on disk.");
|
|
28 // If we caught an exception, either the class was not found or
|
|
29 // it was unreadable by our process.
|
|
30 return null;
|
|
31 //throw new ClassNotFoundException(e.toString());
|
|
32 }
|
|
33 }
|
|
34
|
|
35 protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
|
|
36 // Attempt a disk load first
|
|
37 Class c = findClass2(name);
|
|
38 if( c == null ) {
|
|
39 // check if the class has already been loaded
|
|
40 print("Checking for prior loaded class "+name);
|
|
41 c = findLoadedClass(name);
|
|
42 print("Letting super-loader load "+name);
|
|
43 int old = _recur;
|
|
44 _recur++;
|
|
45 c = super.loadClass(name, false);
|
|
46 _recur=old;
|
|
47 }
|
|
48 if (resolve) { print("Resolving class "+name); resolveClass(c); }
|
|
49 print("Returning clazz "+c.getClassLoader()+":"+name);
|
|
50 return c;
|
|
51 }
|
|
52 }
|