自定义类加载器与JVM内置加载器交互详析
java 指定 class 路径
java -cp .;/myclasspath Test
...小于 1 分钟
java -cp .;/myclasspath Test
MyClassLoader
/**
* 自定义类加载器
*
* @name: MyClassLoader
* @author: terwer
* @date: 2022-07-07 21:37
**/
public class MyClassLoader extends ClassLoader {
// 类加载器的名字
private String name;
// 加载类的路径
private String path = "/home/terwer/Downloads";
// class文件的扩展名
private final String fileType = ".class";
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public MyClassLoader(String name) {
// 让系统类加载器成为类加载器的父类加载器
super();
this.name = name;
}
public MyClassLoader(ClassLoader parent, String name) {
// 显式指定类的父类加载器
super(parent);
this.name = name;
}
@Override
public String toString() {
return this.name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] data = this.loadClassData(name);
return this.defineClass(name, data, 0, data.length);
}
private byte[] loadClassData(String name) {
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
try {
this.name = this.name.replace(".", "/");
is = new FileInputStream(path + "/" + name + fileType);
baos = new ByteArrayOutputStream();
int ch = 0;
while (-1 != (ch = is.read())) {
baos.write(ch);
}
data = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (baos != null) {
baos.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return data;
}
}

类加载器的父亲委托机制(Parent Delegation)
父子加载器不是继承关系,子加载器不一定要继承父加载器。


文章更新历史
2022/05/05 feat:初稿。
ClassLoader)根类加载器(使用 C++ 编写,程序员无法在 Java 代码中使用他们)
扩展类加载器(使用 Java 代码实现)
应用类加载器(系统加载器),使用 Java 实现
文章更新历史
2022/06/26 feat:修复文章图片错误。
2022/05/05 feat:初稿。