一、类加载基本过程




------------记录----------------

二、JVM层面理解类加载
Launcher()类里面定义了 先找扩展类加载器然后在使用自定义加载器,引导类加载器是通过JNI调用C++代码

下图是扩展类加载器双检索实现(单例模式实现)
------------记录----------------
- 类加载器之间的关系父子关系 parent ,也不是传统意义上的面向对象继承,而是顺序执行,Launcher类中定义的.
- 扩展类加载器是单例模式
- 如何保证安全防篡改:"加载器+包名+类名"

三、双亲委派

双亲委派核心代码,一共五行,主要思想就是递归
- 什么类才是唯一的类:"包名+类名"
例如:自己写一个String名,main方法执行不了,
------------记录----------------
- 为什么使用双亲委派?
- 如何打破双亲委派(如何设计一个自己的实现类)?
主要是重写loadClass方法,改变递归调用
java
public class CustomClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
// 1. 针对特定类,自己加载(跳过父类)
if (name.startsWith("com.example.myapp")) {
return findClass(name);
}
// 2. 其他类仍走默认的双亲委派
return super.loadClass(name);
}
@Override
protected Class<?> findClass(String name) {
// 从自定义路径加载类字节码
byte[] classData = loadClassData(name);
return defineClass(name, classData, 0, classData.length);
}
private byte[] loadClassData(String className) {
// 实现类文件读取逻辑(如从特定目录、网络等)
// ...
}
}
四、类加载器的应用

- Tomcat中如何实现不同服务之间隔离(使用类加载器实现)

Tomcat中公共组件的使用了双亲委派,再往上就是传统的JDK类加载器,不同服务有自己服务的类型加载器
Tomcat公共服务共同使用一个类加载器,不同服务到这一层就打破双亲委派实现隔离
其他
如果帮助到了您记得点个赞谢谢!