读书人

java类加载器嘱托机制及源码分析

发布时间: 2012-09-04 14:19:30 作者: rapoo

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块中是逐一向下级加载器中查找

读书人网 >编程

热点推荐