关于classLoader命名空间的问题

问题描述

大家好 目前在看关于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? 和上面的观点有矛盾啊请大侠帮助解决 小弟谢谢了

解决方案

BootStrapClassLoader :加载java运行过程中的核心类库JRElibrt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar 以及存放在JREclasses里的类AppClassLoader :加载CLASSPATH变量指定路径下的类 即指你自已编写的类所以Object和List会使用BootStrapClassLoader,因为它们是JDK提供的,而Test使用的是AppClassLoader,因为这是你自己编写的。1:BootStrapClassLoader :加载java运行过程中的核心类库JRElibrt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar 以及存放在JREclasses里的类2:ExtClassLoader :加载JRElibext 或者目录下的库文件目录下的类(包括任何子目录,有别于其他两个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来改变路径也不起任何作用。

时间: 2024-10-31 14:33:58

关于classLoader命名空间的问题的相关文章

tomact classloader机制

官方原文: http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html 当Tomcat5启动以后,它创建一系列类加载器.这些类加载器以父子关系组织在一起,父类加载器在子类加载器的上面:  Bootstrap  |  System  | Common /    \ Catalina Shared           /        \  Webapp1 Webapp2 ...   ( tomact cl

对java中classloader使用的一点理解(转)

先简单介绍下java的classloader,网上资料很多,就说点关键的. Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的.系统提供的类加载器主要有下面三个: 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader. 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库.Java 虚拟

AS3自写类整理笔记 ClassLoader类第1/2页_Flash as3

主要用途: 1.在用flash做项目的时候,把一些元件,通过设置链接类,然后使用这个类,通过getClass方法即可把这个素材拿下来 图1(详见例1) 2.将许多许多的类分库到不同的swf中,然后通过调用swf,达到调用类库的功能,然后通过getClass来获取类(详见例2) index.base.net.ClassLoader类讲解:加载swf文件,并且通过调用getClass获取类,也可以获取命名空间或者函数的定义 构造函数public function ClassLoader(obj:Ob

在同一个应用中,同一个Class可以被不同的ClassLoader多次装载么?

问题描述 在同一个应用中,同一个Class可以被不同的ClassLoader多次装载么? 解决方案 可以.每个类装载器都有自己的命名空间,其中维护着由它装载的类型.所以一个JAVA程序可以多次装载具有同一个全限定名的多个类型.这样一个类型的全限定名就不足以确定在一个JAVA虚拟机中的唯一性.因此,当多个类装载器都装载了同名的类型时,为了唯一表示该类型,还要在类型名称前加上装载该类型的类装载器来表示.解决方案二:不同的war包内都会有同名的类.的不同版本他们使用了不同的classloader布署在

java 命名空间 命名规则第1/2页_java

摘要                                                                                          Java的类装载器是Java动态性的核心,本文将向大家简要介绍Java的类装载器,及相关的parent delegation模型,命名空间,运行时包等概念,同时讨论一些在学习中容易混淆的问题.  类装载器的功能及分类     顾名思义,类装载器是用来把类(class)装载进JVM的.JVM规范定义了两种类型的类装载

解决PHP SimpleXML 不支持命名空间的问题

  很遗憾 PHP SimpleXML 原生不支持解析带命名空间的 XML 数据.比如有份酱紫的 xml 数据: 芒果小站 不知道如何处理,于是恶心了一把: $content = " 芒果小站 //替换字符串 $content = str_replace('xxx:', '', $content); //读取替换后的字符串 $xml = simplexml_load_string($content); 直接通过字符串替换把所有的命名空间过滤掉.瞬间搞定,哈哈!

命名空间-ASP.NET在加入字符过滤时,调试出错

问题描述 ASP.NET在加入字符过滤时,调试出错 ASP.NET在加入字符过滤时,调试出错,错误信息为""ExtensionAttribute"在命名空间"System.Runtime.CompilerServices"中不明确 ",请教原因 解决方案 你倒入的其他名字空间也存在ExtensionAttribute这个类的定义吧,导致编辑器不知道要使用那个空间下的类库,加上完整名字空间 System.Runtime.CompilerServic

XSLT命名空间输出&amp;amp;&amp;amp;内部调用

XSLT命名空间输出问题: 此属性exclude-result-prefixes可以控制命名空间的输出,比如:exclude-result-prefixes="ne xn en"[注意:命名空间前缀用空格分隔]表示在输出中不出现该命名空间的前缀列表{ne, xm, en}. XSLT中回车换行表示: <xsl:text> </xsl:text> 或 <xsl:text> </xsl:text> XSLT内部调用举例: <?xml v

php命名空间 namespace

php命名空间 namespace 官方说法是: 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突. 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性. 其实命名空间就是为了解决引入不同的文件存在了两个相同的类的情况,其中 __NAMESPACE__ 可以获取namespace的名称. 例如,我有一个index文