8.类的加载器

来源:互联网 发布:解析json数组对象 编辑:程序博客网 时间:2024/05/17 07:26
作用:将类的字节码加载到jvm中,并进行一些处理.


系统默认的类加载器:

类加载器也是一个类,类加载器是由BootStrap加载的,它是嵌套在内核中的一段二进制代码,由c++编写的.


类加载器 加载范围

BootStrap ---> JRE/lib/rt.jar

ExtClassLoader  --->    JRE/lib/ext/*.jar


AppClassLoader---> CLASSPATH指定的所有jar或目录


类加载器的委托机制


java虚拟机要加载一个类时,到底派出哪个类加载器去加载?
(1)由当前线程的类加载器加载线程中的第一个类
(2)如果类A中引用了类B,Java虚拟机使用加载类的A的类加载器加载B
(3)还可以使用ClassLoader.loadClass()方法指定某个类加载器去加载某个类


系统默认的类加载器的委托机制:
当前线程使用AppClassLoader加载器,AppClassLoader委托给ExtClassLoader,ExtClassLoader委托给BootStrap,
BootStrap在JRE/lib/rt.jar查找,如果类存放在该目录下就加载,否则让ExtClassLoader在JRE/lib/ext/*.jar
目录下查找,有就加载,否则让AppClassLoader在CLASSPATH指定的所有jar或目录查找,有就加载,没有就抛出异常.

委托机制的优点:加载器之间相互联系,形成一种加载机制,避免了多个加载同时加载同一类或jar包,保证jvm中只有一份字节码文件.


编写自定义的类加载器


模板方法设计模式


ClassLoader类的介绍
Class<?> loadClass(String name) 
          使用指定的二进制名称来加载类。 //内部方法采用委托机制会自动调用类加载器的父类,当返回时再调用findClass()方法
protected  Class<?> findClass(String name) 
          使用指定的二进制名称查找类。 
protected  Class<?> defineClass(String name, byte[] b, int off, int len) 


调用顺序 父类加载器--返回-->loadClass()--调用-->findClass()--二进制数据返回字节码文件-->defineClass()


创建自定义的类加载器:
(1)继承ClassLoader
(2)重写findClass()方法


如何使用自定义额加载器


Class c=new 自定义类加载器类名().loadClass("指定加载的类");//通过使用自定义类加载器获得指定类的字节码文件对象
原创粉丝点击