自定义类加载器
public class FileSystrmClassLoader extends ClassLoader {
//根路径
private String rootDir;
public FileSystrmClassLoader(String rootDir){
this.rootDir = rootDir;
}
@Override
protected Class<?> findClass(String name) {
//检查该类是不是已经加载过
Class<?> loadedClass = findLoadedClass(name);
//如果已经加载返回该类
if (loadedClass != null){
return loadedClass;
}else{
//如果该类还未加载调用其父类加载器
ClassLoader parent = this.getParent();
try {
loadedClass = parent.loadClass(name);
} catch (ClassNotFoundException e) {
}
//如果其父类加载器可以加载则返回该类
if (loadedClass != null){
return loadedClass;
}else{
//如果其父类不能加载则自己加载该类
byte[] classData = getClassData(name);
if (classData == null){
try {
throw new ClassNotFoundException();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}else{
//使用defineClass方法加载该类
loadedClass = defineClass(name,classData,0,classData.length);
}
}
}
return loadedClass;
}
/*
* 读取class文件的内容并用ByteArrayOutputStream流将文件内容存储到byte[]中
* */
private byte[] getClassData(String name){
String path = rootDir +"/"+ name.replace('.', '/')+".class";
InputStream is = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
is = new FileInputStream(path);
byte[] buffer = new byte[1024];
int temp;
while ((temp = is.read(buffer)) != -1){
byteArrayOutputStream.write(buffer,0,temp);
}
byteArrayOutputStream.flush();
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
}finally {
close(byteArrayOutputStream);
close(is);
}
}
private void close(Closeable io){
if (io != null){
try {
io.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试
public class TestDemo {
public static void main(String[] args) {
//动态编译
JavaCompiler systemJavaCompiler = ToolProvider.getSystemJavaCompiler();
systemJavaCompiler.run(null, null, null, "d:/workspace/com/fxl/bean/Hello.java");
//用自己定义的加载器加载Hello类
FileSystrmClassLoader fileSystrmClassLoader = new FileSystrmClassLoader("d:/workspace");
try {
Class<?> aClass1 = fileSystrmClassLoader.loadClass("com.fxl.bean.Hello");
System.out.println(aClass1.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
结果