码迷,mamicode.com
首页 > 其他好文 > 详细

扩展类加载器的加载问题

时间:2014-10-24 18:52:30      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   java   for   文件   on   2014   

我们都知道java的类载入器共有三级,分别是bootstrap (引导类)加载器、extension(扩展类)加载器和 system (系统类)加载器。这三个加载器是父子关系,其中 bootstrap 类加载器在顶端,而 system 加载器在结构的最底层。同时他们都采取向上传递的机制,即有了要加载的类,先问问自己的父加载器,若父加载器不能加载,自己再加载。

我们写了一个helloworld类,加载的时候,二进制字节码送给系统类加载器,但是系统类会询问它的父加载器(扩展类)你能加载不?扩展类加载器也会询问自己的父加载器(引导类)你能加载不?
通俗的说,引导扩展系统三个加载器就像爷爷父亲孙子一样,他们加载很孝顺,加载类的时候都先让长辈加载,长辈不能加载自己才会去加载。
这样做有什么好处么?
如果你写了一个全名为java.lang.Object的类,里面有一些危险代码,加载时首先会是系统类加载器尝试加载..最后是引导类来加载,它会按照路径直接去C:\Program Files\Java\jdk1.7.0_15\jre\lib\rt.jar这个位置里去找java.lang.Object。总而言之,安全!
public class Property
{
    public static void main(String[] args)
    {
        System.out.println("boot "+System.getProperty("sun.boot.class.path"));
        System.out.println("ext "+System.getProperty("java.ext.dirs"));
        System.out.println("system "+System.getProperty("java.class.path"));
        try
        {
            System.out.println(Class.forName("Property").getClassLoader()+"PPP");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

运行结果

boot C:\Program Files\Java\jdk1.7.0_15\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_15\jre\classes

ext C:\Program Files\Java\jdk1.7.0_15\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext

system .;C:\Program Files\Java\jdk1.7.0_15\lib\dt.jar;C:\Program Files\Java\jdk1.7.0_15\lib\tools.jar;C:\Program Files\Java\jdk1.7.0_15\jre\lib\rt.jar;E:\apache-tomcat-7.0.47_8700\lib\servlet-api.jar;
sun.misc.Launcher$AppClassLoader@fb56b1PPP
通过上面的例子,大家就知道了三级加载器的加载范围;


现在我有一个想法,如果咱们把Property类的class文件放到扩展类加载器的目录下,那它是不是就会被扩展类加载器所加载呢?
ok,我把Property类的class文件放到扩展类加载器的目录下,结果不变;
奇怪了,不是说好了扩展加载器加载 C:\Program Files\Java\jdk1.7.0_15\jre\lib\ext这个目录下的文件吗?

要不,压缩成jar文件?

bubuko.com,布布扣

bubuko.com,布布扣

要不,换个压缩方式?

bubuko.com,布布扣

bubuko.com,布布扣

如下图
现在我们至少能知道几个问题

1 在扩展类加载器的加载目录下,只认jar格式的文件,class文件不看

2 jar还得是zip的压缩格式!



.... 就为了这么一点小问题 我花了快2个小时 惭愧


扩展类加载器的加载问题

标签:blog   http   io   ar   java   for   文件   on   2014   

原文地址:http://blog.csdn.net/dlf123321/article/details/40431297

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!