实现一个自定义类加载器来加载指定目录上的类
package com.bootdo.springBoot.classloader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MyClassLoader extends ClassLoader {
private String directory;
public MyClassLoader(String directory){
this.directory=directory;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String fileName=name;
if(fileName.indexOf(".")!=-1){
fileName.replace("\\.","\\\\");
}
fileName=fileName+".class";
System.out.println(directory+";"+fileName);
try{
try(FileInputStream in=new FileInputStream(directory+fileName)){
try(ByteArrayOutputStream out=new ByteArrayOutputStream()){
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
byte[] data=out.toByteArray();
return defineClass(data,0,data.length);
}
}
}catch (IOException e) {
throw new ClassNotFoundException();
}
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
MyClassLoader myClassLoader=new MyClassLoader("E:\\springsourcecode\\bootdo\\bootdo\\src\\main\\java\\com\\bootdo\\springBoot\\classloader\\");
Class c=myClassLoader.loadClass("Test");
Object test=c.newInstance();
Method method=c.getMethod("show",String.class);
method.invoke(test,"liurong");
}
}
以上的自定义类类加载器可以加载指定目录下的类。
本文介绍了一种自定义类加载器的实现方法,通过继承ClassLoader并覆盖findClass方法,可以实现在指定目录下加载类的功能。具体实现包括读取指定路径下的.class文件,将其转换为字节数组,并使用defineClass方法加载。
4297

被折叠的 条评论
为什么被折叠?



