除了可以用系统默认的类加载器,我们还可以用实现自己的类加载器,类加载器实现步骤如下:
1.定义一个类继承ClassLoader
2.重写findClass方法,用来查找具体的类字节码
3.实例化自定义的类加载器,调用loadClass即可加载类
下面我们来自定义一个类加载器,加载我们自己路径的类字节码
package com.jvm.demo;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
/**
* 自定义类加载器
* @author liuxg
* @date 2016年5月23日 下午5:52:29
*/
public class CustomClassLoader extends ClassLoader{
private String rootPath ;
/**
* 类的路径
* @param rootPath
*/
public CustomClassLoader(String rootPath) {
this.rootPath = rootPath ;
}
/**
* 根据name来寻找该类
*
*/
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> c = findLoadedClass(name);
if (c == null) { //内存堆中还没加载该类
c = findMyClass(name); //自己实现加载类
}
return c ;
}
/**
* 加载该类
* @param name
* @return
*/
private Class<?> findMyClass(String name) {
String path = rootPath + "/" + name.replace(".", "/") + ".class" ;
try {
File file = new File(path); //获取文件
if (file.exists()) {
byte[] bytes = FileUtils.readFileToByteArray(file);//利用org.apache.commons.io包来读取字节
return this.defineClass(null, bytes,0,bytes.length); //调用父类方法,生成具体类
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
使用我们自己的类加载器
public class Demo02 {
public static void main(String[] args) {
CustomClassLoader loader = new CustomClassLoader("D://myclass");
try {
Class<?> clazz = loader.loadClass("com.myclass.Demo03");
System.out.println(clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
有了类加载器,你可以实现从任意地方加载资源,例如硬盘,http,ftp,类路径等等