类加载委托机制:
1.当需要某个类加载器要加载指定的类的时候,并不是立刻到自己的管辖范围去加载指定的字节码文件,而是将这个指定的类传递给父类,由父类尝试去到自己的加载范围去加载这个类。就这样,一级级地向上递推到类加载器的最高父类:JVM的内嵌类加载器---Bootstrap类加载器
2. Bootstrap类加载器首先在自己的管辖范围jre/lib/rt.jar中找到了指定类名对应的字节码文件。
(1)如果找到相应的字节码文件就直接加载进来,结束本次对指定类的加载。
(2)如果没找到,Bootstrap按照原路返回到ExtClassLoader,将这个要加载的指定类型交给ExtClassLoader去加载。
(3)如果还没找到,就这样一级级向子类类加载器递推。如果在中间的某一级的类加载器找到了指定的类的字节码文件,就结束这次对指定类的加载。
3. 如果退回到最初要加载类的类加载器的时候,并且在这个类加载器本身的管辖范围内还是没有找到这个指定的类的字节码文件,就会直接抛出ClassNotFoundException这个异常,不再委托给下一级。
Java为什么使用加载的委托机制:
因为使用委托机制后每个类都会有相对应的类加载器,不会有相同的类被重复加载而浪费资源。 |