Java类加载过程(2)
2016-02-18 11:41
316 查看
java.class.ClassLoader
作用:
java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成对应的字节码代码,然后从这些字节代码中定义出一个Java类,即java.lang.Class类的一个实例
ClassLoader还负责加载Java应用所需的资源,如图像文件和配置文件等
相关方法:
getParent() 返回该类加载器的父加载器
loadClass(String name) 加载名为name的类,返回的结果时java.lang.Class类的实例
findClass(String name) 查找名为name的类,返回的结果是java.lang.Class类的实例
findLoadedClass(String name) 查找名称为name的已经被加载过的类,返回的记过是java.lang.Class类的实例
defineClass(String name,byte[] b,int off,int len) 把字节数组b中的内容转换成Java类,返回记过为java.lang.Class类的实例,这个方法被声明为final的。
resolveClass(Class<?>c)链接指定的Java类
类加载器的代理模式
代理模式:
交给其他加载器来加载指定的类
双亲委托机制:
就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次追溯,直到最高的父辈,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
双亲委托机制是为了保证Java核心库的类型安全(这种机制就保证不会出现用户自己能定义java.lang.Object类的情况)
类加载器除了用于加载类,也是安全的最基本的屏障
双亲委托机制是代理模式的一种
并不是所有的类加载器都采用双亲委托机制
tomcat服务器类加载器也使用代理模式,所不同的是它首先尝试去加载某个类,如果找不到再代理给父类加载器,这与一般类加载器的顺序是相反的。
自定义类加载器的流程:
继承:java.land.ClassLoader
首先检查请求的类型是否已经被这个类加载器装载到命名空间中了,如果已经加载,直接返回;
委托类加载请求给父类加载器,如果父类加载器能够完成,则返回父类加载器加载的Class实例;
调用本类加载器的findClass()方法,试图获取对应的字节码,如果获取得到,则调用defineClass()导入类型到方法去;如果获取不到对应的字节码获取其他原因失败,则返回异常给loadClass(),loadClass()转抛异常,终止加载过程
注意:被两个类加载器加载的同一个,JVM认为是不同的类
文件类加载器
网络类加载器
加密解密类加载器(取反操作,DES对称加密解密)
作用:
java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成对应的字节码代码,然后从这些字节代码中定义出一个Java类,即java.lang.Class类的一个实例
ClassLoader还负责加载Java应用所需的资源,如图像文件和配置文件等
相关方法:
getParent() 返回该类加载器的父加载器
loadClass(String name) 加载名为name的类,返回的结果时java.lang.Class类的实例
findClass(String name) 查找名为name的类,返回的结果是java.lang.Class类的实例
findLoadedClass(String name) 查找名称为name的已经被加载过的类,返回的记过是java.lang.Class类的实例
defineClass(String name,byte[] b,int off,int len) 把字节数组b中的内容转换成Java类,返回记过为java.lang.Class类的实例,这个方法被声明为final的。
resolveClass(Class<?>c)链接指定的Java类
类加载器的代理模式
代理模式:
交给其他加载器来加载指定的类
双亲委托机制:
就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次追溯,直到最高的父辈,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
双亲委托机制是为了保证Java核心库的类型安全(这种机制就保证不会出现用户自己能定义java.lang.Object类的情况)
类加载器除了用于加载类,也是安全的最基本的屏障
双亲委托机制是代理模式的一种
并不是所有的类加载器都采用双亲委托机制
tomcat服务器类加载器也使用代理模式,所不同的是它首先尝试去加载某个类,如果找不到再代理给父类加载器,这与一般类加载器的顺序是相反的。
自定义类加载器的流程:
继承:java.land.ClassLoader
首先检查请求的类型是否已经被这个类加载器装载到命名空间中了,如果已经加载,直接返回;
委托类加载请求给父类加载器,如果父类加载器能够完成,则返回父类加载器加载的Class实例;
调用本类加载器的findClass()方法,试图获取对应的字节码,如果获取得到,则调用defineClass()导入类型到方法去;如果获取不到对应的字节码获取其他原因失败,则返回异常给loadClass(),loadClass()转抛异常,终止加载过程
注意:被两个类加载器加载的同一个,JVM认为是不同的类
文件类加载器
网络类加载器
加密解密类加载器(取反操作,DES对称加密解密)
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树