类加载流程
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
加载->连接(验证、准备、解析)->初始化->使用->卸载
加载:获取class文件 验证:判断是否合法 准备:正式为类变量分配内存并设置其初始值的阶段,这些变量所使用的内存都将在方法区中分配。 解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。+ +
类加载器分类
三种+自定义ClassLoader 引导类加载器(启动类加载器 )BootStrapClassLoader(c/c++) 自定义类加载器(Extension Class Loader、System Class Loader、User-Defined ClassLoader) (java实现)
启动类加载器: 加载/lib/rt.jar 等路径下的jar 扩展类加载器 :加载jre/lib/ext 下的jar包 系统类加载器 :加载classpath 或者java.class.path 下的
双亲委派模型
如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个
请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时
(即 ClassNotFoundException ),子加载器才会尝试自己去加载。翻译: 加载一个类时候,先看父类有没有,如果没有自己再加载
为什么使用双亲委派模型?
类加载器不同,JVM会认为不同类
在 JVM 中,判断一个对象是否是某个类型时,如果该对象的实际类型与待比较
的类型的类加载器不同,那么会返回false。用没用过自定义加载
手写tomcat框架,自定义路径加载器,为了保证不同项目之间隔离,中间加了一层,强制返回null,保证不会被双亲委派到
注意:tomcat违背了双亲委派
- 什么时候需要自定义类加载器?
隔离加载类 :比如tomcat 修改类加载方式 :除了Bootstrap加载器外,其他的加载并非一定要引入。根据实际情况在某个时间点按需进行动态加载 。 扩展加载源 :运行时加载 防止源码泄漏
