自定义类加载器
代码如下
package com.zhiyun.test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class MyClassloader extends ClassLoader {
private final static Path DEFAULT_CLASS_DIR = Paths.get("E:", "classloader");
private final Path classDir;
public MyClassloader(){
this.classDir = DEFAULT_CLASS_DIR;
}
public MyClassloader(String classDir) {
super();
this.classDir = Paths.get(classDir);
}
public MyClassloader(String classDir, ClassLoader classLoader){
super(classLoader);
this.classDir = Paths.get(classDir);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classBytes = this.readClassBytes(name);
if(null == classBytes || classBytes.length == 0){
throw new ClassNotFoundException("can not load the class " + name);
}
return this.defineClass(name, classBytes, 0, classBytes.length);
}
private byte[] readClassBytes(String name) throws ClassNotFoundException{
String classPath = name.replace(".", "/");
Path classFullPath = classDir.resolve(Paths.get(classPath + ".class"));
if(!classFullPath.toFile().exists()){
throw new ClassNotFoundException("The class " + name + " not found.");
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Files.copy(classFullPath, baos);
return baos.toByteArray();
} catch(IOException e){
throw new ClassNotFoundException("load the class "+ name + "occur error.", e);
}
}
public String toString(){
return "My Classloader";
}
}
步骤
分为三步:
- 新建一个类并继承ClassLoader父类
- 读取class文件得到byte数组
- 重写findClass方法,返回this.defineClass(name, classBytes, 0, byteLength),name为要加载的类的全类名,classBytes为第二步中读取到的byte数组, byteLength为数组的长度。
参考
Java高并发编程详解(汪文君 著)