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

解决方案 »

  1.   

    一般来说,dt.jar需要在环境变量classpath中设置,那么似乎应该是Appclassloader加载的?
      

  2.   

    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 写的。