实验目的:测试classloader
package frank;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest {
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ClassLoader myClassLoader = new ClassLoader(){
public Class<?> loadClass(String name) throws ClassNotFoundException {
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
InputStream is = this.getClass().getResourceAsStream(fileName);
if(is == null){
return super.loadClass(name);
}else{
byte[] b;
try {
b = new byte[is.available()];
is.read(b);
return this.defineClass(name, b, 0, b.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new ClassNotFoundException(name);
}
}
}
};
//self define loader
Object obj = myClassLoader.loadClass("frank.ClassLoaderTest").newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());
//application loader
System.out.println(frank.ClassLoaderTest.class.getClassLoader());
}
}
实验结果:
frank.ClassLoaderTest@19836ed
frank.ClassLoaderTest$1@15093f1
sun.misc.Launcher$AppClassLoader@39ab89
实验总结, java1.2之前可以覆盖loadClass方法, java 1.2 之后建议实现覆盖findClass 方法。
例子请看下面
package frank;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoader3 extends ClassLoader{
public Class<?> findClass(String name){
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
InputStream is = this.getClass().getResourceAsStream(fileName);
if(is == null){
try {
return super.loadClass(name);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
byte[] b;
try {
b = new byte[is.available()];
is.read(b);
return this.defineClass(name, b, 0, b.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
throw new ClassNotFoundException(name);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
return null;
}
}
package frank;
public class ClassLoaderTest2{
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ClassLoader3 loader3 = new ClassLoader3();
Object obj = loader3.findClass("frank.ClassLoaderTest2").newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());
System.out.println(frank.ClassLoaderTest2.class.getClassLoader());
}
}
输出:
frank.ClassLoaderTest2@3e0ebb
frank.ClassLoader3@e6f7d2
sun.misc.Launcher$AppClassLoader@39ab89