6257
|
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 |
}
|