0 0

关于classLoader命名空间的问题10

大家好 目前在看关于java虚拟机的书籍

书上说 个各类装载器都使用单独的命名空间 一个类型无法看到不在同一个命名空间装载的其它类型

书上还说 没个被加载到方法区的class类型都有一个常量区 常量区中存放着其他类型的名字 字段 方法

在jvm解析阶段 需要把常量区中的其它类型的符号引用指向正确的类型地址 而且在解析过程中使用当前类的classLoader的命名空间去搜索和加载其它类型 比如Cat类是被一个用户自定义的类加载器加载的,当虚拟机解析指向Mouse的引用时,会检查Mouse是否已经被Cat所属的命名空间加载 如果没有 就是用Cat的类加载器加载Mouse类 即使Mouse已经被加载到另一个命名空间中

于是我写了一个测试小程序

public class Test {

    public static void main(String[] args) throws Exception{
        Object o = new Object();
        List<String> l = new ArrayList<String>();
       
        System.out.println(o.getClass().getClassLoader());
        System.out.println(l.getClass().getClassLoader());
        System.out.println(Test.class.getClassLoader());
    }
}


为什么Test类使用的是AppClassLoader 而Object 和 List 还是使用的Bootstrap ClassLoader? 和上面的观点有矛盾啊

请大侠帮助解决 小弟谢谢了





OO 
2011年9月15日 11:34

1个答案 按时间排序 按投票排序

0 0

采纳的答案

BootStrapClassLoader  :加载java运行过程中的核心类库JRE\lib\rt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar 以及存放在JRE\classes里的类

AppClassLoader          :加载CLASSPATH变量指定路径下的类  即指你自已编写的类

所以Object和List会使用BootStrapClassLoader,因为它们是JDK提供的,而Test使用的是AppClassLoader,因为这是你自己编写的。


1:BootStrapClassLoader  :加载java运行过程中的核心类库JRE\lib\rt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar 以及存放在JRE\classes里的类
2:ExtClassLoader           :加载JRE\lib\ext 或者目录下的库文件目录下的类(包括任何子目录,有别于其他两个ClassLoader)
3:AppClassLoader          :加载CLASSPATH变量指定路径下的类

A、其中AppClassLoader的parent(并非父类)为ExtClassLoader, ExtClassLoader的parent为BootStrapClassLoader,根据ClassLoader的委托模型,当要加载一个class时候会先让其parent来加载,如果parent找不到的话,再由自己来加载。
B、加载的第一个类的ClassLoader如果为BootStrapClassLoader的话,那么其他的所有类也必须又BootStrapClassLoader来加载,如果加载第一个类的ClassLoader为AppClassLoader的话,则类的加载按规则A来执行。

BootStrapClassLoader的默认Load路径可以通过 System.getProperty("sun.boot.class.path");来取得
ExtClassLoader的默认Load路径可以通过 System.getProperty("java.ext.dirs");来取得
AppClassLoader的默认Load路径可以通过 System.getProperty("java.class.path");来取得

其中ExtClassLoader,AppClassLoader的load可以通过命令:java -Djava.ext.dirs xxx xxx,java -Djava.class.path xxx xxx来改变
而BootStrapClassLoader的路径是用C++写死在JVM里面的,即使通过java -Dsun.boot.class.path xxx xxx来改变路径也不起任何作用。

2011年9月15日 12:33

相关推荐

    Java的类装载器和命名空间

    主要讲述Java的类装载器和命名空间,ClassLoader/parent delegation模型

    JAVA面试题,Java是一种面向对象的编程语言,由Sun Microsystems公司(现属Oracle公司)于1995年推出

    答:Package是Java语言的命名空间机制,它用于组织类和接口。通过包可以避免类名冲突,并提供更清晰的类层次结构。 5. 什么是Object类? 答:Object类是Java语言的根类,所有Java类都直接或间接继承自Object类。Object...

    Plugins.Core:构建具有合理默认值和现代功能的插件的基础

    Plugins.Core 包包含一个简单的MybbStuff_Core_ClassLoader类,可用于按照 PSR 约定自动加载类,但使用 PEAR 样式类命名。 例如,请参阅以下类及其预期路径(在注册了如下所示的名称空间之后): defined ( '...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段54讲、ClassLoader命名空间,运行时包,类卸载详细介绍.mp4 │ 高并发编程第二阶段55讲、线程上下文类加载器以及数据库驱动案例分析.mp4 │  └─第三阶段  Java并发编程.png  Java高并发...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段54讲、ClassLoader命名空间,运行时包,类卸载详细介绍.mp4 │ 高并发编程第二阶段55讲、线程上下文类加载器以及数据库驱动案例分析.mp4 │  └─第三阶段  Java并发编程.png  Java高并发...

    Spring.3.x企业应用开发实战(完整版).part2

    9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 ...

    Spring3.x企业应用开发实战(完整版) part1

    9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 ...

    超级有影响力霸气的Java面试题大全文档

    为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java...

    java 面试题 总结

    为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每...

    IBM portlet开发指南

    Portlet开发指南............................................................................................................................... 1 第一章节 入门介绍 ........................................

Global site tag (gtag.js) - Google Analytics