一.ClassLoader分为bootClassStrap,ExtClassLoader,AppClassLoader.
booeClassStrap由C或更底层的语言实现,用来加载jvm和操作系统最底层的核心类库
Ext由java实现,用来加载比较核心的类库
App由java实现,用来加载应用资源,比如class path中的资源,eclipse plugin中的资源等等
二.加载器通常都是把加载权优先上抛给parent加载器,当parent加载不到时才转交给child,最后一个child也加载不到时,抛出ClassNotFoundException.
三.如下代码:
ClassLoader cl = MyClassLoader.class.getClassLoader(); System.out.println(cl); System.out.println(cl.getParent()); System.out.println(cl.getParent().getParent()); System.out.println("bootStrap:“"+System.getProperty("sun.boot.class.path")); System.out.println("extClassLoader:“"+System.getProperty("java.ext.dirs")); System.out.println("appClassLoader:“"+System.getProperty("java.class.path")); ClassLoader cl2 = MyDfs.class.getClassLoader(); System.out.println("----------------------------------------------"); System.out.println(cl2); System.out.println(cl2.getParent()); System.out.println(cl2.getParent().getParent()); System.out.println("bootStrap:“"+System.getProperty("sun.boot.class.path")); System.out.println("extClassLoader:“"+System.getProperty("java.ext.dirs")); System.out.println("appClassLoader:“"+System.getProperty("java.class.path"));
运行结果:
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
bootStrap:“F:\istallHome\java\jdk\jre\lib\resources.jar;F:\istallHome\java\jdk\jre\lib\rt.jar
extClassLoader:“F:\istallHome\java\jdk\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
appClassLoader:“D:\workspace\project\work\hadoop-0.19.2\hadoop-0.19.2\src\contrib\eclipse-plug...
----------------------------------------------
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
bootStrap:“F:\istallHome\java\jdk\jre\lib\resources.jar;F:\istallHome\java\jdk\jre\lib\rt.jar
extClassLoader:“F:\istallHome\java\jdk\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
appClassLoader:“D:\workspace\project\work\hadoop-0.19.2\hadoop-0.19.2\src\....
可以看出来。他们分别加载了哪些东西,而且不同两个类的classLoader其实是同一个对象。至于BootStrap为什么为null.那是因为他不是java object,因为是用其他底层语言实现的,所以我们无法看到他的对象信息,但其实它是存在的。