zoukankan      html  css  js  c++  java
  • 【Java学习笔记】类的加载器

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    1.作用:

    用来把类加载到JVM虚拟机。

    2.加载过程特征:

    当请求加载器loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若父加载器不能加载则loader1本身去加载。这样可以保证Java平台的安全。

    3.种类:

    a)根(Bootstrap)加载器:该加载器没有父加载器,负责加载虚拟机的核心类库。其实现依赖于底层的操作系统,属于虚拟机实现的一部分。

    b)扩展(Extension)类加载器:其父加载器为根类加载器,负责从java.ext.dirs系统属性所指定的目录中加载类,或者从JDK安装目录的jre/liv/ext子目录下加载类库。其是纯Java类,是java.lang.Classloader的子类。

    c)系统(System)类加载器:也称为应用类加载器,它的父加载器为扩展类加载器,负责从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义类的默认父加载器。其是纯Java类,是java.lang.Classloader的子类。

    4.具体加载过程: Class sampleClass = loader2.loadClass(“sample”);

    loader2首先从自己的命名空间中查找Sample类是否已经被加载,若已经加载,就直接返回代表Sample类的Class对象的引用。若没有加载,loader2会一步步向上请求各级父加载器加载直到顶端,然后层层返回加载是否成功的讯息,若没有一处成功的,则抛出ClassNotFound异常。若有一个类加载器能成功加载,那么称其为定义类加载器,所有能成功返回Class对象的引用的类加载器(包含定义类加载器)都称为初始类加载器。

    注意:加载器之间的父子关系不是指继承,而是加载器对象之间的包装关系。一对父子类加载器可能是同一加载类的两个实例,例如:

    ClassLoader loader1 = new MyClassLoader();

    ClassLoader loader2 = new MyClassLoader(loader1);//参数loader1作为loader2的父加载器

    5.命名空间的定义:

    每个类的加载器都有自己的命名空间,其是由该加载器及所有父类加载器所加载的类组成。

    6.运行时包:

    由同一类加载器加载的属于相同包的类组成了运行的包,决定两个类是不是属于同一运行时包,不仅看其包名是否相同,还要看定义类加载器是否相同。

    7.创建自定义的类加载器

    通过扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用。具体的可以参考http://blog.csdn.net/assre/archive/2006/01/18/583398.aspx

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    关于分析web.xml的一篇博客,写的很详细
    (转)Java编译后产生class文件的命名规则
    Standard 1.1.x VM与Standard VM的区别
    throws和throw的用法例子以及检测和非检查异常
    终端IO(上)
    [APUE]进程关系(下)
    [APUE]进程关系(上)
    [APUE]进程控制(下)
    [APUE]进程控制(中)
    深究标准IO的缓存
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2843679.html
Copyright © 2011-2022 走看看