`
jukyoc
  • 浏览: 13125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ClassLoader(一)基础

    博客分类:
  • JAVA
阅读更多
Java ClassLoader基础知识(网上内容整理后所得)转自http://www.blogjava.net/clraychen/archive/2008/02/20/180868.html
    Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
    这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader
和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader

Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。
AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。
URLClassLoader用来加载网络上远程的类,暂且不讨论。

它们之间的关系:

1.Parent-Child,按顺序从大到小。不是简单的继承关系。

2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。

3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException

4.类A调用类B,B会要求调用它的类的类加载器来加载它,也就是B会要求加载A的加载器来加载B。这就会有个问题,如果他们在一起,那没关系,肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中,而B在Classpath中呢?过程是这样的首先加载A,那么一层层上到Bootstrap Classloader,boot没找到所以ext自己找,找到了,没问题;加载B,因为A调用了B,所以也从bootstrap来找,没找到,然后A的ext classloader来找还是没找到,但是再也不会往下调用了,于是报出ClassNotFoundException。
但是现实生活中有很多应用,比如JDBC核心方法在核心库而驱动在扩展库,是必定在两个地方的,那怎么办呢?要用到Context ClassLoader我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.
分享到:
评论

相关推荐

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    ClassLoader 详解.doc

    总之,ClassLoader是Java程序运行的基础,理解其工作原理及特性对于成为一名合格的Java开发者至关重要。通过本文档的学习,读者可以深入理解Java虚拟机加载类的过程,掌握如何自定义和优化类加载机制,从而提升应用...

    classloader

    1. Bootstrap ClassLoader:这是最基础的类加载器,负责加载系统的预定义类,如java.*和android.*包下的类。它是由C++实现的,并且是不可见的,开发者通常不直接与之交互。 2. Extension ClassLoader:扩展类加载器...

    ClassLoader的 一些测试

    1. Bootstrap ClassLoader:这是最基础的类加载器,由C++实现,负责加载JDK核心库(rt.jar)。 2. Extension ClassLoader:扩展类加载器,负责加载JRE的扩展目录(jre/lib/ext目录下的jar文件)。 3. AppClassLoade...

    classloader体系结构(含hotswap)

    1. Bootstrap ClassLoader(启动类加载器):它是JVM启动时创建的第一个类加载器,负责加载JDK的核心库,包括位于`$JAVA_HOME/jre/lib`目录下的rt.jar、charsets.jar等基础类库,或者通过-Xbootclasspath选项指定的...

    Android Classloader测试demo

    在Android系统中,Classloader(类加载器)是至关重要的组件,它负责查找并加载Java类到Dalvik或ART运行时环境。这个测试demo是为了帮助开发者深入理解Android中两种主要的类加载器:DexClassLoader和...

    使用classloader动态加载Class

    Java提供了三个基础类加载器:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按照层次结构加载类。 1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态...

    Java ClassLoader原理

    动态类加载是Java虚拟机的基础机制之一,它为Java平台带来了许多独特的优势。例如,它使得应用程序能够在运行时从远程服务器下载和执行代码片段,从而极大地提高了系统的灵活性和响应速度。下面将详细介绍这些关键...

    ClassLoader类加载器

    1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`<JAVA_HOME>/lib`目录下的核心类库,或者被`-Xbootclasspath`参数指定的路径中的类。 2. Extension ClassLoader:扩展类加载器,...

    classloader的简单实现

    在Java编程语言中,类加载器(ClassLoader)是一个至关重要的组件,负责将类的字节码从磁盘、网络或其他数据源加载到JVM(Java虚拟机)中,然后将其转换为运行时的类对象。这个过程是Java程序动态加载和运行的基础。...

    深入Java虚拟机_ClassLoader

    《深入Java虚拟机_ClassLoader》是一本...通过阅读《深入Java虚拟机_ClassLoader》这本书,开发者可以掌握更高级的JVM技巧,优化程序性能,解决类加载相关的复杂问题,并为构建高效、安全的Java应用程序打下坚实基础。

    jboss 5 原理 2 classloader

    JBoss 5是一款知名的Java应用服务器,其在类加载(Class Loading)方面有着独特的处理方式。随着OSGi(Open Services Gateway Initiative)风格的类加载机制逐渐流行,以及新的Java模块和类加载规范的出现,JBoss对...

    Java ClassLoader Tutorial.zip

    一、Java ClassLoader 基础 1. 类加载过程:Java中的类加载分为三个阶段——加载、验证、准备、解析和初始化。ClassLoader主要参与的是加载阶段,它从磁盘、网络或其他数据源读取字节码文件,并将其转换为Class对象...

    java自定义类加载classloader文档,包括代码

    - **构造函数**:接受一个父类加载器和基础目录作为参数。 - **`findClass()`方法**:重写`ClassLoader`中的`findClass()`方法,该方法用于实际加载类的二进制数据。首先调用`loadClassData()`方法从文件系统读取类...

    JAVA ClassLoader 讲解 (类加载器)

    1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,负责加载Java的核心库类,如`java.lang`包下的类。 2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统...

    web_classloader_test.zip_web classloader

    1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类加载的顺序。当一个类加载器收到加载类的请求时,它会首先委托父类加载器去尝试加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。这...

    Tomcat 5.0.18 ClassLoader source code insight

    尤其在类加载(Class Loading)机制方面,它是Java应用程序运行的基础,也是理解Tomcat工作原理的关键一环。本文将围绕Tomcat 5.0.18版本的ClassLoader源码进行深入分析,旨在帮助读者了解其工作方式,提升对Java...

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

    在“【IT十八掌徐培成】Java基础第25天-04.classLoader-系统资源-不可见类访问.zip”这个课程中,徐培成老师将深入讲解ClassLoader的工作原理以及如何处理系统资源,特别是关于不可见类访问的话题。 首先,...

    浅析ClassLoader

    一、ClassLoader基础 1. 类加载过程:Java中的类加载分为加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。ClassLoader主要涉及加载阶段,将...

    测试普通Java程序ClassLoader等级关系的Demo程序

    本Demo程序主要探讨的是Java中的ClassLoader等级关系,这一主题对于理解Java应用程序的运行机制至关重要。 首先,我们要了解ClassLoader的基本概念。在Java中,ClassLoader是一个系统组件,它根据指定的全限定类名...

Global site tag (gtag.js) - Google Analytics