----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
1.ClassLoader
类加载器负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象。
当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
-->BootStrap:根类加载器
-->ExtClassLoader:扩展类加载器。
-->AppClassLoader:应用类加载器。
当JVM要加载一个类时,使用哪个类加载器加载呢?
首先当前线程类加载器去加载第一个类。
如果当前类引用了另一个类,那么会使用当前类的类加载器去加载另一个类。
或者使用指定类加载器加载。
当依据上述步骤加载类时,每个步骤又会依据类加载器的父类委托机制。
类加载机制的父类委托机制:先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
如图:
注:
1)类加载的缓存机制:所有被加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜寻该Class,只有当缓存中不存在该Class对象时,系统才会重读取该类对应的二进制数据,并将其转成Class对象,并缓存。
2)初始化一个类时,先将其父类初始化。
public class ClassLoaderDemo {
public static void main(String[] args) {
//得到本类的类加载器
ClassLoader loader = ClassLoaderDemo.class.getClassLoader();
//得到类加载器的父类加载器,直到为空
while(loader != null){
System.out.println(loader.toString());
loader = loader.getParent();
}
System.out.println(loader);
}
}
2.自定义类加载器
JVM中除了根加载器之外的所有类加载器都是ClassLoader子类的实例,开发者可以通过扩展ClassLoader的子类,并重写该ClassLoader所包含的方法来实现自定义的类加载器。
ClassLoader类有如下三个关键方法:
loadClass(String name, boolean resolve):该方法为CLassLoader的入口点,根据指定的二进制名称来加载类,系统就是调用CLassLoader的该方法来获取指定类对应的Class对象。
findClass(String name):根据二进制名称来查找类。
defineClass(String name, byte[] b, int off, int len):将指定类的字节码文件读入字节数组byte[] b内,并把它转化为Class对象。
当我们自定义类加载器时,一般只要重写findClass方法即可。
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
. . .
}
}
----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------详细请查看:
http://edu.csdn.net