基本概念
想象你在一个大家庭(Java 世界)里,有很多不同的人(类加载器)负责找东西(加载类)。JVM 的双亲委派机制就像是一个找东西的规则。
类加载器的层级关系
在这个大家庭里,有不同层级的人负责找东西。最顶层是启动类加载器(Bootstrap ClassLoader),它就像是家族里最有威望的长辈,负责找一些最基础、最重要的东西(比如 Java 核心类库,像java.lang.Object这些非常基础的类)。
下一层是扩展类加载器(Extension ClassLoader),它就像是家族里稍微年轻一点的长辈,负责找一些扩展的东西(例如javax包下的一些类,这些类是对 Java 功能的扩展)。
再下一层是应用程序类加载器(Application ClassLoader),这就像是家族里的年轻人,负责找你自己写的程序里用到的类。
双亲委派机制的工作过程(找东西的规则)
当你(应用程序类加载器)想要找一个东西(加载一个类)的时候,你不会直接去找,而是先问问你的长辈(父类加载器)有没有这个东西。比如说,你(应用程序类加载器)想找一个java.lang.String类,你会先问扩展类加载器有没有这个类,扩展类加载器又会问启动类加载器有没有。
启动类加载器一看,这个java.lang.String类是我负责的基础类啊,我有,然后就把这个类给大家用。如果启动类加载器没有这个类,那就会让扩展类加载器去找,如果扩展类加载器也没有,最后才轮到你(应用程序类加载器)自己去找。
这样做的好处是可以保证类的唯一性。比如说,如果没有这个规则,你自己写了一个java.lang.String类,按照这个机制,JVM 会优先使用启动类加载器加载的真正的java.lang.String类,而不是你自己写的可能会搞乱系统的类。这样就保证了 Java 核心类库的类不会被随意替换,整个 Java 系统的稳定性就得到了保障。