java类加载器委托机制及源码分析
一 1.当加载一个类时,首先委派当前线程的类加载加载
??????2.如果类A中引用了B java虚拟机将使用加载A的类的类加载器去加载B类
??????3.还可以调用setClassLoader和loaderClass方法来指定类加载器去加载某个类
二?每个类加载器加载类时有委托给他的上一级类加载器 当所有祖宗加载器都加载不到指定的类就回到发起者那里 如果发起者那里还是找不到 就会抛classNotFoundException 而不是继续让其下一级类加载器去查找
?
java虚拟机子所以采用这种加载机制 是因为为了避免同一份class文件被两个不同的类加载器加载两份同样地字节码到内存中
?
下面通过java的源码来理解java虚拟机的委托机制
protected synchronized Class<?> loadClass(String name, boolean resolve)
?throws ClassNotFoundException
??? {
?// First, check if the class has already been loaded
//首先 检查这个class文件时候已经被加载过了
?Class c = findLoadedClass(name);
/如果没有被加载过 则交给他的上一级附加在器加载
?if (c == null) {
???? try {
????????????//如果附加在器存在 则交给父加载器去查找 如果父加载器不存在 则说明他的父加载器是根加载器
??????????? if (parent != null) {
???????????????? c = parent.loadClass(name, false);
??????????? } else {
?????????????? ? c = findBootstrapClass0(name);
??????????? }
???? } catch (ClassNotFoundException e) {
???????? // If still not found, then invoke findClass in order
???????? // to find the class.
?????????//如果上级的加载器还是找不到 就会报ClassNotFoundException异常 就会调用自己实现的查找方法
???????? c = findClass(name);
???? }
?}
?if (resolve) {
???? resolveClass(c);
?}
?
每个类加载器的查找流程都是像loadClass方法里面那样的 try语句里是逐一向父加载器中查找 catch块中是逐一向下级加载器中查找