闲来无事,看看jvm,看到自定义的classLoder,就写了一个实例,希望对大家有所帮助,欢迎批评指正
首先,自定义的classloader需要继承java的classLoder类,同时覆写findClass方法,废话不说了,直接上代码
MyClassLoader:自定义的classloader
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 自定义classloader
* @author liuxiaochen
*
*/
public class MyClassLoader extends ClassLoader
{
String path = "d:\\";
String name;
String fileType = ".class";
public MyClassLoader(String name) {
super() ;
this.name = name ;
}
public MyClassLoader(ClassLoader classloader, String name) {
super(classloader) ;
this.name = name ;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
byte[] data = loadClassData(name) ;
return defineClass(name, data, 0, data.length) ;
}
@Override
public String toString()
{
return this.name ;
}
private byte[] loadClassData(String name)
{
byte[] data = null;
InputStream in = null;
ByteArrayOutputStream baos = null;
try
{
this.name = this.name.replace(".", "\\");
in = new FileInputStream(new File(path + name + fileType));
baos = new ByteArrayOutputStream();
int cnt = 0;
while (-1 != (cnt = in.read()))
{
baos.write(cnt);
}
data = baos.toByteArray();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
in.close() ;
baos.close() ;
} catch (IOException e)
{
e.printStackTrace();
}
}
return data;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
MyClassLoader loader1 = new MyClassLoader("loader1") ;
loader1.setPath("d:\\myapp\\loader1lib\\") ;
MyClassLoader loader2 = new MyClassLoader(loader1, "loader2") ;
loader2.setPath("d:\\myapp\\loader2lib\\") ;
MyClassLoader loader3 = new MyClassLoader(null, "loader3") ;
loader3.setPath("d:\\myapp\\syslib\\") ;
System.out.println("-------------");
test(loader1) ;
System.out.println("-------------");
test(loader2) ;
System.out.println("-------------");
// test(loader3) ;
}
public static void test(ClassLoader classloder) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
Class<?> classzz = classloder.loadClass("Sample") ;
Object instance = classzz.newInstance() ;
}
}
其实java的jdk上已经给了一个实例,如下,不过只是框架,代码啥的自己写就行,
网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。示例实现如下:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
好了,自定义的classLoder写好了
写两个测试的类,做一下
public class Sample
{
public Sample()
{
System.out.println("sample is loader by" + this.getClass().getClassLoader());
new Dog() ;
}
}
public class Dog
{
public Dog()
{
System.out.println("dog is loader by " + this.getClass().getClassLoader());
}
}
行了,剩下的,就比较简单了,测试吧,把class文件分别放到设置好的路径下,试试自定义的classloder吧
不吝赐教