java类加载器

来源:互联网 发布:pc端与移动端用户数据 编辑:程序博客网 时间:2024/06/06 04:25

java类加载器,顾名思义就是加载类的工具。那有什么作用的呢?当程序需要某个类,那么就需要通过类加载器把类的二进制加载到内存中。当然类加载器也是Java类。

一.在java中共计有4种类加载器

1.根类加载器(Bootstrap,c++实现,是扩展类加载器的父类加载器)加载范围“jre/lib/rt.jar”
2.扩展类加载器(ExtClassLoader,java实现,是系统类加载器的父类加载器) 加载范围“jre/lib/ext/*.jar”
3.系统类加载器(AppClassLoader,java实现,是用户自定义类加载器的父类加载器) 加载范围“CLASSPATH指定的所有jar或目录”
4.用户自定义的类加载器(需要继承ClassLoader类重写findClass(String name)方法,所有用户自定义的加载器的父类加载器都是系统类加载器) 加载范围“用户指定的特殊目录”

二.类加载器的父委托机制:

       也就是说当父亲能把类加载进来就不需要儿子干了,只有当父亲干不了才由儿子去加载这个类。举一个例子,当一个用户自定义的类加载器ClassLoaderA要加载ClassA,首先ClassLoaderA会将这个事情委托给系统类加载器,系统类加载器再委托给扩展类加载器,扩展类加载器再委托给根类加载器,如果根类加载器能加载则加载,如果不能就扩展类加载器进行加载,如果还是不能则由系统类加载器进行加载,如果还是不能,那只好自己(ClassLoaderA)加载,如果还是不能则就会则抛出ClassNotFoundException异常了。这个过程就是类加载器的父委托机制了。(所谓的能不能加载就是看这个类加载器的加载范围内能不能找到要加载的类)

可以使用下面的代码获得当前测试类(ClassLoaderTest)的加载器。
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
classLoader.getClass().getName();
可以使用classLoader.getParent();方法获得classLoader的父类加载器。如果classLoader.getParent()返回的是“null”则证明classLoader的父类加载器为根类加载器。

三.类的加载要分为3个步骤:

1.加载:查找并加载类的二进制数据。
2.连接:2.1验证:确保被加载的类的正确性(保证这个类可以被jvm正确的执行)。
              2.2准备:为类的静态变量分配内存空间,并将其初始化为默认值(int默认为0等等)。
              2.3解析:把类中的符号引用转换为直接引用(代码中调用对象中的某个方法就是一个符号引用)。
3.初始化:为类的静态变量赋予正确的初始值(对类的首次主动使用,例如new,调用静态方法或变量,反射等)。

0 0
原创粉丝点击