一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
1 类的加载过程
- Loading:将class文件加载到内存,class文件本来是在磁盘上的二进制文件
- Linking
- Verification:校验,校验class文件语法是否符合class文件标准
- Preparation:class的静态变量赋予默认值,static int a = 1, 则此处给a 赋值为0
- Resolution:解析:将class文件里边的常量池的符号引用变为直接引用
- Initializing:静态变量赋值为初始值
2 类加载器ClassLoader
Bootstrap:加载JDK里最核心的jar。例如lib/rt.jar charset.jar等核心类,C++实现 用getClassloader() 输出加载器时为null
Extension:加载扩展jar包,jre/lib/ext/*.jar
App: 加载classpath指定内容,用户写的class类
CustomClassLoader:自定义ClassLoader
3 双亲委派机制
3.1 简介
当一个class文件需要被load到内存的时候。
- 先去
CustomClassLoader里去找,类加载器内部维护了一个缓存,查询这个class是否已经被加载,若是找到则返回,若是没有找到 - 则委托给
App加载器,在App的缓存中去找,若是找到则返回,若还是没有找到 - 则委托给
Extension加载器,在Extension的缓存中找,若是找到则返回,若还是没有找到 - 则委托给
Bootstrap加载器,在Bootstrap的缓存中找,若是找到则返回,若还是没找到 则此时整个类加载器中都没有这个class文件,需要加载 Bootstrap判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托Extension加载器加载Extension加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托App加载器加载App加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托CustomClassLoader加载器加载CustomClassLoader加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则抛出异常ClassNotFoungException
3.2 为什么需要双亲委派机制呢?
主要是为了安全,其次是为了防止资源浪费。
若是没有双亲委派机制,java.lang.Sting由自定义加载器加载,并且java.lang.Sting是自定义的只是名字相同,其中的方法若有危险,盗取密码等,则不能保证安全。