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

相关推荐

    php 七牛sdk 整合 不需要命名空间也可以使用

    然而,有些开发者可能遇到在旧版本PHP环境中或者不支持命名空间(namespace)的代码库中使用七牛SDK的问题。本文将详细介绍如何在不依赖命名空间的情况下整合PHP七牛SDK。 首先,理解PHP的命名空间功能。命名空间是...

    Java ClassLoader原理

    这意味着不同软件组件可以在不同的命名空间中加载,从而避免了命名冲突的问题。例如,在HotJava浏览器中,Applet是从远程服务器加载的,并且与本地应用程序的类隔离在一个单独的命名空间中。 #### 类加载器的工作...

    Java的类装载器和命名空间

    在Java编程语言中,类装载器(ClassLoader)和命名空间是理解Java运行时环境的重要概念。它们共同确保了程序的正确性和安全性。类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,...

    使用classloader动态加载Class

    再比如,基于命名空间的ClassLoader可以按模块划分,只加载特定命名空间下的类。 5. **安全考虑**:动态加载也带来了安全风险,因为它允许代码在运行时加载未知来源的类。因此,在实现动态加载时,需要对加载的类...

    classloader体系结构(含hotswap)

    这意味着,当你通过`Class.forName`加载类时,该类将与调用它的类处于相同的命名空间,保证了类之间的关联性。 最后,`ClassLoader.getCallerClassLoader()`用于获取调用者类的类加载器,这在某些场景下非常有用,...

    classloader的简单实现

    - **命名空间和类型安全**:在C++中,类加载器需要处理命名空间和类型系统,以确保正确地解析和实例化类。 在"my_classloader"文件中,可能包含了这个类加载器的源代码、测试用例或其他相关资源。分析这些文件可以...

    深入Java虚拟机_ClassLoader

    一个ClassLoader实例通常对应一个类加载的命名空间,一旦创建,其生命周期就开始了。除非应用程序显式卸载,否则ClassLoader通常不会被垃圾收集。 8. 热部署与类重加载: 在开发环境中,热部署允许开发者修改代码...

    java 命名空间 命名规则

    ### Java命名空间与命名规则详解 #### 概述 Java作为一种广泛应用的编程语言,其设计哲学之一便是确保代码的可维护性和可读性。为了达到这一目标,Java规定了一系列命名规则来帮助开发者编写清晰、一致的代码。...

    Java classloader和namespace详细介绍

    命名空间是每个ClassLoader特有的,由它装载的类拥有独特的标识。即使两个类具有相同的全限定名,只要它们是由不同的ClassLoader装载,那么它们在JVM中就被认为是不同的类。这提供了模块化和隔离性,使得不同模块的...

    【IT十八掌徐培成】Java基础第25天-04.classLoader-系统资源-不可见类访问.zip

    但是,这也可能导致类间的不可见性问题,因为每个类加载器都有自己的命名空间。 在“不可见类访问”这个主题中,徐培成老师可能会讲解如何处理这种问题,例如使用反射API(java.lang.reflect)来访问非公共类或者...

    ClassLoaderDemo.7z

    在`ClassLoaderDemo`中,可能通过`parent`和`child`来演示如何加载同一命名空间下的不同版本的类,或者实现组件隔离。 **5. 破坏双亲委托模型** 破坏双亲委托模型通常意味着子加载器不完全遵循向父加载器的委托顺序...

    classloader 热部署

    每个类加载器都有自己的命名空间,避免了类名冲突。Java的类加载机制遵循“双亲委派模型”,即从Bootstrap ClassLoader开始,逐级向下查找,直到找到对应的类。 热部署通常涉及到类的重新加载,而Java的默认类加载...

    Java Class Loader总结.doc

    ClassLoader还负责保护系统命名空间的完整性,通过预定义类(pre-define classes)并检查类名的合法性来防止非法类的加载。例如,以下是一段简单的ClassLoader代码片段,展示了类名检查的过程: ```java private ...

    class loader

    4. **多命名空间支持**:每个类加载器都提供了独立的命名空间,这意味着不同的软件组件可以拥有各自的类库。 - **应用场景**:HotJava浏览器就是一个很好的例子,它可以为每个下载的Applet提供独立的命名空间,...

    java深度历险

    了解如何有效地管理import语句,能提高代码的可读性和维护性,同时,理解命名空间和包的概念,有助于避免命名冲突。 在《Java深度历险》这本书中,读者将深入探究这些主题,通过实例分析和实战演练,掌握Java核心...

    基于沙箱的Java安全体系结构

    - **命名空间与运行时包**:类装载器为每个加载的类提供了独立的命名空间,从而避免了恶意代码干扰正常运行的代码。同一命名空间下的类可以互相访问,而不同命名空间的类之间则不能直接通信,除非明确允许。 - **...

    Tomcat中JNDI原理

    这允许每个应用或类加载器具有自己的命名空间,从而避免了命名冲突。 #### 三、`ContextBinding`机制解析 在`org.apache.naming.ContextBindings`类中,有两组关键方法: 1. **`bindClassLoader`**:此方法用于将...

    php-fig-psr-8:PHP FIG PSR-8实现

    它定义了一个接口,用于在不同的命名空间表示之间进行转换,使得代码库可以更方便地处理第三方库的命名空间。 **PSR-8接口介绍** PSR-8标准定义了一个`Hoa\Ustring\Transformer`接口,其主要目的是提供一个统一的...

    classloader:重新设计的 DICIoC 解决方案,包括类别名

    1. **自动加载**:通过PSR-4(PHP Standard Recommendation 4)或其他自动加载规范,根据命名空间和类名自动加载对应的类文件,减少了手动引入类的需要。 2. **依赖注入**:允许在运行时为对象注入其依赖,可以通过...

    openjdk-1.6.0.41-src.x86_64

    - `org`包:一般用于组织或开源项目的命名空间,如`org.w3c.dom`(W3C DOM接口)。 通过研究这些源代码,开发者可以更深入地理解JVM的运行机制,特别是在类加载、内存管理、线程同步等关键领域。对于想要提升Java...

Global site tag (gtag.js) - Google Analytics