类加载器
2021-03-29 21:50:58 0 举报
图解类加载器
作者其他创作
大纲/内容
被引用类
起始类加载器1.加载引用类的类加载器。如引用类A需要加载被引用类B,加载器B为起始类加载器2.加载类B过程中只会有经由加载器B和加载器A处理,即使加载器C已经加载类B,也会抛出类未找到的异常(上级加载的类不能引用下级加载的类)
程序
类加载过程
回到起始加载器
上级
安全机制1.如果此类之前已经加载过,则不需要经过上级加载2.一切以上级的加载为准,存在上级时必须先交由上级加载3.所有加载都要由上级加载或者授权(上级加载失败时,下级才可以加载)
1.权限控制:不同层级加载不同的类,且只能由该层级加载2.同一条上下级链上,同一类只加载1次如链“自定义加载器1实例1->应用类加载器->扩展类加载器->引导类加载器”同一类只加载一次;但同一类可以被自定义加载器1实例1、自定义加载器1实例2及自定义加载器2加载,但彼此相互隔离,如Tomcat类加载器。3.引用权限:下级加载的类可以引用上级加载的类;上级加载的类不能引用下级加载的类。破坏双亲委派1.重写loadClass方法破坏加载规则2.当前类加载器无法加载,却不按照加载规则处理。如DriverManager的实现。
设计模式:责任链+模板方法责任链:每个类加载器负责一部分类加载,或处理或回传给下级节点;通过getParent获取上级节点。模板方法:loadClass定义算法骨架,但未申明为fianl,可以通过覆盖该方法破坏双亲委派机制
由下级加载
不允许
正常
由上级加载器加载
子类
符号引用转直接引用(运行期)
自定义加载器1-实例1
继承(编译期)
通过接口使用
已加载
上级加载
开始
接口实现class
通过反射访问
类A
下级类加载器
尝试加载
加载成功
加载器B
上级加载的类不能直接引用下级加载的类(可通过反射)红色箭头运行期抛出异常
抛出异常
无法通过new访问
自定义加载器1-实例2
异常
当前类加载器已加载过此类
引用规则
存在上级
下级负责加载
加载器C
下级
父类
1.上级加载器加载下级加载器2.通过下级加载器加载接口实现字节码(3.程序无法通过new方式创建接口实现对象,上级加载的类无法引用下级加载的类4.只能通过反射创建接口实现实例5.程序可以通过反射的方式访问接口实现实例6.程序也可以将接口实现实例强制类型转换成接口进行访问DriverManager SPI实现机制DriverManager由bootstrap加载,在ServiceLoader的迭代过程中调用nextService委托app加载器加载字节码,通过反射创建实例对象,并将对象强制类型转换为Driver实例。
上级类加载器
类B
由本级加载器加载
自定义加载器2
强制类型转
扩展类加载器Extension ClassLoader
上级加载成功
下级加载的类可以引用上级加载的类绿色箭头表示允许
兄弟层级相互不影响(隔离,如Tomcat)1.A继承自B,A由上级加载,B可以分别被不同的下级或下级实例加载。2.存在多份B类对象,且相互不能转换(类完全限定名+同一类加载器的同一实例才认为是相同的对象)。
起始类加载器
可通过反射实例化对象
引导类加载器Bootstrap ClassLoader
应用类加载器Application ClassLoader
加载器A
接口实现实例
接口
上级加载失败委托下级加载
分类
加载位置
备注
引导类加载器
JAVA_HOME/jre/lib
C++实现,无法直接访问
扩展类加载器
JAVA_HOME/jre/lib/ext
上级为 Bootstrap,显示为 null
应用类加载器
classpath
上级为 Extension
自定义加载器
自定义
上级为 Application
双亲委派机制要求
反射创建对象
0 条评论
下一页