ClassLoader自我总结
2015-06-08 16:06
309 查看
jdk下的解释ClassLoader:
(1)类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
(2)每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。
(3)数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
谷歌搜到的资料总结:
java.lang.ClassLoader 类介绍
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class 类的一个实例。除此之外,ClassLoader 还负责加载 Java 应用所需的资源,如图像文件和配置文件等。
JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader(C++)、Extension ClassLoader和AppClassLoader.Bootstrap是用Java编写的,我们在Java中看不到它(Bootstrap ClassLoader),是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。其中Extension ClassLoader负责加载扩展 的Java class(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。
AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader。这4种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。确切地说,假如一个网络类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,假如返回已装载,则网络类装载器将不会装载这个java.lang.Integer,假如上一级的类路径装载器返回未装载,它才会装载java.lang.Integer.
注意:上面图中Parent ClassLoader加载该Class不成功的话会继续请求Parent ClassLoader,如果都加载不成功的话,才会让App ClassLoader加载该类
当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。
关于自定义ClassLoader:
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
主要可以扩展的方法有:
findClass 定义查找Class的方式
defineClass 将类文件字节码加载为jvm中的class
findResource 定义查找资源的方式
样例:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
由于classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
所以,当我们自定义的classloader加载成功了com.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。
(1)类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
(2)每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。
(3)数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建。数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
谷歌搜到的资料总结:
java.lang.ClassLoader 类介绍
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class 类的一个实例。除此之外,ClassLoader 还负责加载 Java 应用所需的资源,如图像文件和配置文件等。
JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader(C++)、Extension ClassLoader和AppClassLoader.Bootstrap是用Java编写的,我们在Java中看不到它(Bootstrap ClassLoader),是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。其中Extension ClassLoader负责加载扩展 的Java class(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。
AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader。这4种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。确切地说,假如一个网络类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,假如返回已装载,则网络类装载器将不会装载这个java.lang.Integer,假如上一级的类路径装载器返回未装载,它才会装载java.lang.Integer.
注意:上面图中Parent ClassLoader加载该Class不成功的话会继续请求Parent ClassLoader,如果都加载不成功的话,才会让App ClassLoader加载该类
当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。
关于自定义ClassLoader:
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
主要可以扩展的方法有:
findClass 定义查找Class的方式
defineClass 将类文件字节码加载为jvm中的class
findResource 定义查找资源的方式
样例:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
由于classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
所以,当我们自定义的classloader加载成功了com.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。
相关文章推荐
- java单例设计模式
- Spring的用法
- GDB(十) 调试正在运行的进程
- 《编程珠玑》阅读小记(4) — 编写正确的程序
- Android 图片阴影处理分析!
- ZOJ 3877 Earthstone Keeper(最短路问题)
- appium client 的安装(python)
- 《编程珠玑》阅读小记(4) — 编写正确的程序
- 计算百度关键词出现密度
- IAR 8.30 安装包和破解补丁
- Kolmogorov复杂度(转)
- Java并发编程:线程池的使用
- 以lnmp为基础搭建discuz论坛
- Java集合框架概要
- Android 高级Drawable资源---复合Drawable----级别列表Drawabled
- 【算法】矩阵相乘
- Linux shell if判断语句
- 计算两点之间的距离,两点之间的斜率(角度)--秀清
- Windowform 窗体关联数据库存储,读取图片,参考代码
- DataSet,DataTable,XML格式互转