JVM类加载器
系统中的类加载器
1.BootStrap ClassLoader
a.启动ClassLoader
b.加载rt.jar
2.Extension ClassLoader
a.扩展ClassLoader
b.加载JAVA_HOME/lib/ext/*.jar
3.App ClassLoader
a.应用ClassLoader/系统ClassLoader
b.加载ClassPath下
4.Custom ClassLoader
a.自定义ClassLoader
b.自定义加载路径
类加载器之间的协同工作方式 (双亲模式):
a.自底(4)向上(1)检查类是否已经被加载
b.自顶(2)向下(4)尝试加载类
c.在查找类的时候,先在底层的Loader查找,是从下往上的。Apploader能找到,就不会去上层加载器加载
一个概念上的ClassLoader
a.双亲模式的问题:顶层ClassLoader,无法加载底层ClassLoader的类
b.为了解决这个问题,Java引入了ContextClassLoader的概念
是一个角色
用以解决顶层ClassLoader无法访问底层ClassLoader的类的问题
基本思想是,在顶层ClassLoader中,传入底层ClassLoader的实例
ClassLoader的重要方法
public Class<?> loadClass(String name) throws ClassNotFoundException
载入并返回一个Class
protected final Class<?> defineClass(byte[] b, int off, int len)
定义一个类,不公开调用
protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass回调该方法,自定义ClassLoader的推荐做法
protected final Class<?> findLoadedClass(String name)
寻找已经加载的类