黑马程序员--类加载器

来源:互联网 发布:g73外圆凹圆弧编程实例 编辑:程序博客网 时间:2024/06/10 20:47

-----------ASP.Net+Unity开发----.Net培训------------------

类加载器:就是加载类的工具。


JAVA虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类。

类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码
(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。基本上所有的类加载器都是 java.lang.ClassLoader类
的一个实例。java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个
Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。
每一个类都有自己的类加载器,由于加载进内存,系统默认的类加载器有三种:Bootstrap(c++编写),ExtClassLoader,AppClassLoader,
一般当前线程会调用自己的类加载器加载线程,如果类A中引用了类B,则jvm会调用类A的类加载器加载类B,也可以自己创建加载器加载;当前类调用自己的类加
载器加载,会先委托父类加载器加载,父类也会委托自己的父 类加载器加载,如果都没加载到,则返回当前类的类加载器,还是没加载到,则报错,不会去找
子类;
 BootStrap-------ExtClassLoader------AppClassLoader classpath指定的类加载器
    父级              子集               子子集
类加载器也是JAVA类,因为其他是JAVA类的类加载器背身也要被类加载其加载。显然必须有第一个类加载器不是jAVA类,这正是BootStrap;所以类加载器是用BootStrap加载的。


Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。 


类名.class.getClassLoader().getClass().getname();获取类加载器名称。


类加载器的委托机制:
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。 
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。


类加载器是类的加载工具,主要有三种类加载器 一种是BootStrap  一种是ExtClassLoader  一种是 AppClassLoader 
自定义类加载器:
   类加载器必须要继承ClassLoader。 覆盖findClss

<1> 加载的三个步骤:1,装载:查找和导入class文件。
   2,链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
   3,初始化:对静态变量,静态代码块执行初始化工作 
<2> ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包
<3> AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类 
<4>,Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这ClassLoder载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生 除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。

-----------ASP.Net+Unity开发----.Net培训------------------

详情请查看http://www.itheima.com


0 0
原创粉丝点击