-
关于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? 和上面的观点有矛盾啊
请大侠帮助解决 小弟谢谢了
2011年9月15日 11:34
1个答案 按时间排序 按投票排序
-
采纳的答案
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的类装载器和命名空间,ClassLoader/parent delegation模型
答:Package是Java语言的命名空间机制,它用于组织类和接口。通过包可以避免类名冲突,并提供更清晰的类层次结构。 5. 什么是Object类? 答:Object类是Java语言的根类,所有Java类都直接或间接继承自Object类。Object...
Plugins.Core 包包含一个简单的MybbStuff_Core_ClassLoader类,可用于按照 PSR 约定自动加载类,但使用 PEAR 样式类命名。 例如,请参阅以下类及其预期路径(在注册了如下所示的名称空间之后): defined ( '...
│ 高并发编程第二阶段54讲、ClassLoader命名空间,运行时包,类卸载详细介绍.mp4 │ 高并发编程第二阶段55讲、线程上下文类加载器以及数据库驱动案例分析.mp4 │ └─第三阶段 Java并发编程.png Java高并发...
│ 高并发编程第二阶段54讲、ClassLoader命名空间,运行时包,类卸载详细介绍.mp4 │ 高并发编程第二阶段55讲、线程上下文类加载器以及数据库驱动案例分析.mp4 │ └─第三阶段 Java并发编程.png Java高并发...
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章 ...
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章 ...
为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java...
为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每...
Portlet开发指南............................................................................................................................... 1 第一章节 入门介绍 ........................................