努力成为面试高手08:类加载器

类加载器

类加载器介绍

类加载器的作用就是将类的字节码(.class文件)加载到 JVM 中,变成可执行的 Class 对象。每个类都会记住加载它的类加载器,但是数组类不由类加载器加载,而是由 JVM 自动生成,其类加载器和数组元素类型的类加载器一致。类加载器除了加载类,也能加载图片、配置文件等资源,但最核心的功能还是加载类。

类加载器加载规则

JVM不会在启动时就加载所有类,而是采用“按需动态加载”的策略,即什么时候用到这个类,什么时候才加载它。一个类一旦被某个类加载器加载过,就会被缓存起来放在 ClassLoader 中,之后不会再重复加载。对同一个类加载器来说,同一个类只会被加载一次。

类加载器总结

  1. BootstrapClassLoader (启动类加载器)
  • 身份:终极大佬,C++写的,在Java里没有名字,所以显示为null

  • 职责:只负责运送最核心的JDK内部类库(比如rt.jar里的java.lang.*java.util.*等)

  1. ExtensionClassLoader (扩展类加载器) 
  2. AppClassLoader (应用程序类加载器)

JVM内置了三个有“父子关系”的类加载器,像公司层级一样各司其职:大老板(Bootstrap) 负责核心部门,二老板(Extension) 负责扩展业务,项目经理(Application) 负责我们自己的项目。除了这三个,我们还可以自己雇“临时工”(自定义类加载器)来干特殊的话。

自定义类加载器

在 Java 中,除了最底层的 BootstrapClassLoader,其他类加载器都是 Java 实现的,并且都继承自 ClassLoader 类。如果我们要自己实现一个类加载器,就必须继承 ClassLoader,并重点了解它的两个核心方法:loadClass() 和 findClass() 。

loadClass() 方法实现了“双亲委派”机制(先让父加载器尝试加载),而 findClass() 是给子类重写用的,默认是空方法。官方建议重写 findClass() 而不是 loadClass() ,这样可以保持双亲委派机制,只有想打破双亲委派机制时,才去重写 loadClass() 。

双亲委派模型

双亲委派模型介绍

双亲委派模型是 Java 类加载的一种工作模式:每个类加载器都有一个“父加载器”,加载类时先让父加载器尝试加载,父加载器找不到时自己才加载。这种机制保证了核心类库不会被自定义类覆盖,确保了 Java 程序的稳定和安全。

类加载器之间的父子关系是通过组合(ClassLoader parent 成员变量)实现的,而不是继承。这体现了“组合优于继承,多用组合少用继承”的设计原则。

双亲委派不是强制约束,可以按需打破(比如实现热部署或加载不同版本的类)。

双亲委派模型执行流程

  • 在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载(每个父类加载器都会走一遍这个流程)。
  • 类加载器在进行类加载的时候,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成(调用父加载器 loadClass() 方法来加载类)。这样的话,所有的请求最终都会传送到顶层的启动类加载器 BootstrapClassLoader 中。
  • 只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载(调用自己的 findClass() 方法来加载类)。
  • 如果子类加载器也无法加载这个类,那么它会抛出一个 ClassNotFoundException 异常。

重要规则:JVM 判断两个类是否相同,不仅要看类名,还要看 类加载器 是否相同。同一个 .class 文件被不同的类加载器加载,会被当作两个不同的类。

双亲委派模型好处

双亲委派模型通过“先让父加载器尝试加载”的机制,实现了两个重要目标:一是避免同一个类被重复加载,浪费内存;二是保护核心类库(如 java.lang )不被恶意篡改,确保 Java 运行环境的安全和稳定。

打破双亲委派模型的办法

Tomcat 作为一个 Web 容器,需要同时运行多个 Web 应用,并且这些应用可能依赖不同版本的同一个库(比如 Spring)。为了隔离不同应用、实现类库的共享与独立,Tomcat 没有完全遵循 Java 默认的“双亲委派模型”,而是自定义了一套类加载器,并允许子加载器在某些情况下优先加载类。

参考

JavaGuide | 类加载器详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值