日期:2014-05-20  浏览次数:20672 次

jvm是如何找到dt.jar的,它是用哪个类加载器加载的
dt.jar里面是和swing相关的内容,因此使用swing组件的时候会使用它.
问题是我现在将系统的classpath设置为.;   这时还是能找到swing组件.
java中类由三种类加载器加载bootclassloader   Extendclassloader   Appclassloader
boot负责加载核心类库,Ext负责加载ext扩展包中的类,App负责用户定义的类和第三方的类(从classpath读取需要加载的类).那么swing   属于哪个部分,由谁来加载

------解决方案--------------------
帮顶
------解决方案--------------------
一般来说,dt.jar需要在环境变量classpath中设置,那么似乎应该是Appclassloader加载的?
------解决方案--------------------
ClassLoader 加载顺序如下:
1.jvm建立
2.初始化动作
3.产生第一个ClassLoader,即bootstrap loader
4.bootstrap loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null
5.bootstrap loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入的)
6.AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入.

自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系
ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定。
ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext。
Bootstrap loader的查找url是sun.boot.class.path。
在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改。
Bootstrap loader 是固化在JVM 中的,并不是用Java 写的。