1、先建一个被加载的测试类
public class Person {
private Integer age;
public Integer getAge() {
return age;
}
@Override
public String toString() {
return "测试类加载成功";
}
}
2、建一个自定义的类加载器
继承ClassLoader类,重写findClass,这样不破坏Java的双亲委派机制。
public class PathClassLoader extends ClassLoader{
private String classPath;
public PathClassLoader(){
}
public void setClassPath(String classPath) {
this.classPath = classPath;
}
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
byte[] classData = getClassByte(className);
if(classData == null){
throw new ClassNotFoundException();
}
return defineClass(className,classData,0,classData.length);
}
public byte[] getClassByte(String className) {
String path = classPath + File.separator+ className.replace(".",File.separator) + ".class";
InputStream inputStream = null;
try {
inputStream = new FileInputStream(path);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length=inputStream.read(buffer)) != -1){
byteArrayOutputStream.write(buffer,0 ,length);
}
return byteArrayOutputStream.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
3、测试类
public static void main(String[] args) throws Exception {
String classPath = "D:\\workspace\\idea\\fmdes\\target\\classes";
PathClassLoader classLoader = new PathClassLoader();
classLoader.setClassPath(classPath);
String className = "com.fmys.api.test.Person";
Class loadClass = classLoader.loadClass(className);
System.out.println(loadClass.newInstance());
}
4、结果会输出 测试类加载成功