类加载优先级由双亲委派模型决定,Bootstrap ClassLoader优先级最高,Extension次之,Application最低;类加载时先委托父加载器,父无法加载时子加载器才尝试加载,确保核心类安全与类唯一性;Tomcat隔离和SPI机制等场景会打破该模型。
在Java中,类加载的优先级主要体现在类加载器的委托机制和双亲委派模型上。理解类加载优先级,关键在于搞清楚类加载器之间的层级关系以及类加载时的查找顺序。
Java中的类加载器分为三类,按优先级从高到低依次是:
Bootstrap ClassLoader(启动类加载器):负责加载JVM核心类库(如rt.jar),用C++编写,是虚拟机的一部分。开发者还可以自定义类加载器,通常继承ClassLoader类,其默认父加载器就是应用类加载器。
当一个类加载器收到类加载请求时,并不会自己立刻去加载,而是先委托给父类加载器去完成。这个过程从下往上层层委托,直到到达顶层的启动类加载器。只有当父类加载器无法完成加载(返回null),子类加载器才会尝试自己加载。
这个机制确保了:
虽然“优先级”听起来像是谁先加载谁就高,但实际是“父优先”的原则。比如:
真正体现“优先级”的场景是:如果某个类已经被父类加载器加载过了,子类加载器就不会再加载一遍,这就是类的共享与隔离机制。
有些特殊场景需要绕过这种优先级机制,比如:
基本上就这些。类加载的“优先级”本质是委托顺序和类加载器的层级控制,理解清楚双亲委派模型,就能掌握Java类加载的核心逻辑。