Java虚拟机中可以安装多个类加载器,系统默认三个
主要类加载器,每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader
类加载器也是java类,因为其他是java类的类加载器
本身也要被类加载器加载,显然必须有第一个类加载器不是
java类,这正是BootStrap。
Java虚拟机中的所有类装载器采用具有父子关系的树形
结构进行组织,在实例化每个类装载器对象时,需要为其
指定一个父类装载器对象或者默认采用系统类装载器为
其父级类加载。
类加载器之间的父子关系和管辖范围图
-----------------------------------------------
BootStrap------------>JRE/lib/rt.jar
|
ExtClassLoader------->JRE/lib/ext/*.jar
|
AppClassLoader------->CLASSPATH指定的所有jar或目录
|| |<--SystemclassLoader
||__________
MyClassLoader | \
| --->传智博客指定的特殊目录
ItcastClassLoader /
类加载器的委托机制:
当java虚拟机要加载一个类时,到底派出哪个类加载器
去加载呢?
首先当前线程的类加载器其加载线程中的第一个类。
如果类A中引用类B,JAva虚拟机将使用加载类A的类加载器
来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个
类加载器去加载某个类。
每个类加载器加载类时,先委托给其上级类加载器。
当所有祖先加载器没有加载到类,回到发起者类加载器,
还加载不了,则抛ClassNotFoundException,不是再去找
发起者类加载器的儿子,因为没有getChild方法,即使有,
那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前
将ClassLoaderTest输出成JRE/lib/ext目录下的itcast.jar
包中后,运行结果为ExtClassLoader的原因。
===================
模板方法设计模式
父类:loadClass/findClass/得到class文件的转换成字节码-->defineClass
子类1(自己干)
子类2(自己干)
server
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------