自定义类加载器与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)
父子加载器不是继承关系,子加载器不一定要继承父加载器。


加载:例如从磁盘把class文件加载到jvm
链接:确定类与类之间的关系,字节码的安全校验等
初始化:为静态变量赋值
System.exit() 方法javap MyTest1

javap -c MyTest1

基于JVM的动态语言和静态语言生态圈很繁荣
大纲
类似Apple的Swift
https://developer.apple.com/swift/
jvm平台上的语言
https://www.oracle.com/technical-resources/articles/java/architect-languages.html
文章更新历史
2022/05/05 feat:初稿。
ClassLoader)根类加载器(使用 C++ 编写,程序员无法在 Java 代码中使用他们)
扩展类加载器(使用 Java 代码实现)
应用类加载器(系统加载器),使用 Java 实现