定义自己的ClassLoad需要继续ClassLoad然后重写里面的findClass()方法
package com.example.demo.test;
import java.io.*;
/**
* @author Waja
*/
public class MyClassLoad extends ClassLoader {
private String path;
private String name;
public MyClassLoad(String path, String name) {
this.path = path;
this.name = name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classByte = new byte[0];
try {
classByte = loadClassData(name);
} catch (IOException e) {
e.printStackTrace();
}
return defineClass(name, classByte, 0, classByte.length);
}
private byte[] loadClassData(String name) throws IOException {
name = path + name + ".class";
FileInputStream fileInputStream = new FileInputStream(new File(name));
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
byte[] data = new byte[512];
int len;
while ((len = fileInputStream.read(data)) != -1) {
arrayOutputStream.write(data, 0, len);
}
fileInputStream.close();
arrayOutputStream.close();
return arrayOutputStream.toByteArray();
}
}
然后验证。应为findClass方法处理的对象Class文件,所以需要先将Java文件编译成Class文件
package com.example.demo.test;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author Waja
*/
public class PreformClassLoad {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
MyClassLoad myClassLoad = new MyClassLoad("Class文件的位置", "ClassLoad的名字");
Class c = myClassLoad.loadClass("Class文件的名字");
System.out.println(c.getClassLoader());
}
}