一,类加载器概述
1,BootStrap JRE/lib/rt.jar
ExtClassLoader JRE/lib/ext/*.jar
AppClassLoader classpath指定的所有jar或者目录
2,父子关系
BootStrap
ExtClassLoader
AppClassLoader
3,通过getParent()得到父亲加载器
那么根得到的是null,因为BootStrap是一个特殊的类加载器
是随着JVM启动而启动的,是一段C++的二进制代码
4,所有的类加载器都是一个对象
5,类加载器的委托机制
加载一直向上,让最根的类加载器加载(爷爷)
爷爷类加载器找不到,让父亲加载,父亲加载不了,
推给孙子(也就是发起者),找不到,抛出异常
不会抛给这个类加载的孩子。这样可以保证内存中
有一份唯一的字节码。
6,自定义类加载必须挂载在类加载树上
需要继承ClassLoader
7,加载一个类的时候,先使用当前线程的类加载器加载类
如果第第一个类引用了第二个类,那么第二个类的加载
1,BootStrap JRE/lib/rt.jar
ExtClassLoader JRE/lib/ext/*.jar
AppClassLoader classpath指定的所有jar或者目录
2,父子关系
BootStrap
ExtClassLoader
AppClassLoader
3,通过getParent()得到父亲加载器
那么根得到的是null,因为BootStrap是一个特殊的类加载器
是随着JVM启动而启动的,是一段C++的二进制代码
4,所有的类加载器都是一个对象
5,类加载器的委托机制
加载一直向上,让最根的类加载器加载(爷爷)
爷爷类加载器找不到,让父亲加载,父亲加载不了,
推给孙子(也就是发起者),找不到,抛出异常
不会抛给这个类加载的孩子。这样可以保证内存中
有一份唯一的字节码。
6,自定义类加载必须挂载在类加载树上
需要继承ClassLoader
7,加载一个类的时候,先使用当前线程的类加载器加载类
如果第第一个类引用了第二个类,那么第二个类的加载
是使用第一个类的类加载器,也可以强制指定一个类加载器进行加载
二,自定义类加载器
1,继承ClassLoader
2,仅仅需要覆盖findClass();
子类先使用父类的loadClass(),不成功的话使用自己的findClasss()
如果子类复写loadClass()那么就会自己干
3,defineClass()将class文件转换为字节码