类的加载

2018-09-19  本文已影响0人  机器不能学习

jvm中,类的加载分为:加载+链接+初始化
在这个过程中,类的加载少不了类加载器。它与反射功能类似。

类加载器分为启动类加载器、扩展类加载器、系统类加载器。
三个加载器呈现双亲委派模式。双亲委派:接受到任何任务都把任务交与上一级处理,直到该类没有上级(到了启动类加载器)。这时启动类加载器就先处理(首先看缓存中有无该对象,没有再去所管辖目录寻找),如果找不到再把任务交与下层处理。
这个模式的好处在于,不会重复加载。如果父亲已经加载子类没必要加载。(比如你要加载一个object类,子类接受任务后就加载了,那么系统就有两个object了,如果交给最上层,那么最上层会在它的管辖中找到该类,并把该类返回,就避免了重复加载)

实现类:
ClassLoader:顶级加载类。
它提供了方法loadClass():先会查看是否被缓存过,不存在在查看是否有父类可以上交,没有再去查找。还是没找到的话会调用findClass()方法。
findClass():该方法是用户自己实现的寻找类方法
defineClass:与findClass连用,该方法会把传入的byte字节创建成对象,并且返回
resolveClass():该方法会在对象关键完成的同时被解析

URLClassLoader
该类是一个扩展类,它已经为我们写好了以上方法,只用直接传入一个URL就能够获得对象。

类与解析器的关系:
判断两个Class对象是否为同一个类的根据是完整类名相同,加载类相同。
如果用findClass就不会在缓存中寻找,生产的两个类实例一定不同。而loadClass先会去缓存找,所以返回的实例可能相同

应用:自定义加载器,网络加载,热点部署
https://blog.csdn.net/javazejian/article/details/73413292

线程上下文:违背双亲委派,为SPI提供服务
https://blog.csdn.net/javazejian/article/details/73413292

上一篇下一篇

猜你喜欢

热点阅读