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/

  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2843679.html
Copyright © 2011-2022 走看看