打破双亲委派:自定义类加载器实战
引言 为什么要学习这个主题? 在前面的文章中,我们了解了双亲委派模型及其保护机制。但实际开发中,有些场景需要突破这些限制: Tomcat如何实现多个应用使用不同版本的同一个库? 如何实现代码的热部署(不重启更新代码)? 如何加密class文件防止反编译? 这些需求都需要自定义类加载器。理解自定义类加载器,就能掌握Java类加载的灵活性和扩展性。 你将学到什么? ✅ 如何自定义类加载器 ✅ 如何打破双亲委派模型 ✅ 实现热部署功能 ✅ 实现类文件加密 ✅ Tomcat的类加载架构 ✅ 自定义类加载器的最佳实践 一、自定义类加载器的基础 1.1 继承ClassLoader 自定义类加载器只需要继承ClassLoader并重写findClass方法。 public class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { // 1. 根据类名找到.class文件 // 2. 读取字节码数据 // 3. 调用defineClass转换为Class对象 return super.findClass(name); } } 1.2 关键方法 方法 作用 是否重写 loadClass() 加载类的入口 通常不重写(保持双亲委派) findClass() 查找并加载类 必须重写 defineClass() 字节码 → Class对象 不要重写(final方法) resolveClass() 解析类 可选重写 重要: 重写findClass():遵循双亲委派 重写loadClass():打破双亲委派 二、实战1:从指定目录加载类 2.1 需求 从/custom/classes/目录加载类,而不是从classpath。 ...