实验四: classloader

实验目的:测试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

 

 

猜你喜欢

转载自frankytony.iteye.com/blog/2261841