扩展类加载器的加载问题

我们都知道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;

[email protected]

通过上面的例子,大家就知道了三级加载器的加载范围;

现在我有一个想法,如果咱们把Property类的class文件放到扩展类加载器的目录下,那它是不是就会被扩展类加载器所加载呢?

ok,我把Property类的class文件放到扩展类加载器的目录下,结果不变;

奇怪了,不是说好了扩展加载器加载 C:\Program Files\Java\jdk1.7.0_15\jre\lib\ext这个目录下的文件吗?

要不,压缩成jar文件?

要不,换个压缩方式?

如下图

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

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

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

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

时间: 2024-11-03 03:26:30

扩展类加载器的加载问题的相关文章

面试题思考:其实类加载器的加载机制很简单

针对类加载器的分类与说明 一.类加载器的分类: 1.系统提供的类加载器 1.BootStarp(引导类加载器):负责加载java核心类库,不继承自ClassLoader加载器: 2.Extension(扩展类加载器):负责加载java扩展库(例如sun公司专门为连接数据库设计的JDBC的一组API) 3.Application(系统类加载器): 负责加载普通用户编写的java应用类 备注:1.BootStrap加载器是由原生代码(C++)编写而成的,因此不继承自ClassLoader加载器,其他

Java 类加载器及加载Class字节码

参考来源:http://www.cnblogs.com/fingerboy/p/5456371.html       java笔记--理解java类加载器以及ClassLoader类 参考来源:http://blog.csdn.net/shareus/article/details/52422788    Java 类加载器及加载Class字节码

Java 理解类加载过程 -- 自定义加载器

类加载器可以看下我的收藏: https://www.cnblogs.com/dongguacai/p/5879931.html 现在准备一个字节码文件: 自定义加载器: 1 package com.xzlf.test; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8

扩展类加载器-------改变JAVA的父优先类加载顺序

java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做"父优先"模型. 但是在实际项目中我们可能会要求先从当前类加载加载再从父类加载器加载,如项目中的某类的版本可能和container中的不一致的时候,若还从container加载就会报jar包冲突的异常,实际上jar包冲突的问题在实际开发过程中是经常会遇到的.如我们在开发Loong时就遇到了类似问题. 解决方案是通过

C编译器、链接器、加载器详解

摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可加载.可执行代码的过程. 过程图解如下: 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是

PHP 开启了扩展却还是无法加载oci8 扩展的原因和解决方法

开启了PHP 的oci8 扩展,但是打印 var_dump ( get_loaded_extensions() )还是没有出现oci8 ,pdo_oci,pdo_odbc扩展. 之后去oracle官网下载 ,解压缩,之后修改系统的环境变量,还是无法使用. 最后的解决方法,安装  OracleDatabaseInstantClient11g11.2.0.3.0 x64 ,安装之后就可以正常. OracleDatabaseInstantClient11g11.2.0.3.0 x64 是CSDN某为大

使用js加载器动态加载外部Javascript文件

今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 MiniSite.Browser={ 6 ie:/msie/.test(window.navigator.userAgent.toLowerCase()), 7 moz:/gecko/.test(window.navigator.userAgent.toLowerCase()), 8 opera:/o

自研模块加载器(二) 加载器结构与设计导论

结构导论 模块部分 数据初始化: 加载器中设计来一个名为Module的构造函数,每个模块都是此构造函数实例对象.构造函数中给实例对象扩展了"未来"所需用到的属性和方法. 模块存储: 加载器中设计来一个名为cache的缓存对象,每个文件(模块)都会存储在cache对象中. 具体存储方式: { "当前模块的绝对路径" : new Module()}, 注意: 当前模块的绝对路径是通过资源部分,资源定位方法实现的. 每个模块创建都先初始化数据,存储在缓存对象中. 资源部分

Struts2配置拦截器,struts2加载常量时的搜索顺序

1:struts2加载常量时的搜索顺序 1.Struts-default.xml 2.Struts-plugin.xml 3.Struts.xml 4.Struts-properties(自己创建的) 5.web.xml 如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面的文件配置的常量值 2:Struts2拦截器配置 1.在Struts.xml中配置一个默认请求的action <!-- 没有找到action时默认执行的action --> <default-acti