类加载器-面试复习

139 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

1 类的加载过程

未命名文件.jpg

  1. Loading:将class文件加载到内存,class文件本来是在磁盘上的二进制文件
  2. Linking
    1. Verification:校验,校验class文件语法是否符合class文件标准
    2. Preparation:class的静态变量赋予默认值,static int a = 1, 则此处给a 赋值为0
    3. Resolution:解析:将class文件里边的常量池的符号引用变为直接引用
  3. 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 双亲委派机制

未命名文件 (1).jpg

3.1 简介

当一个class文件需要被load到内存的时候。

  1. 先去CustomClassLoader里去找,类加载器内部维护了一个缓存,查询这个class是否已经被加载,若是找到则返回,若是没有找到
  2. 则委托给App加载器,在App的缓存中去找,若是找到则返回,若还是没有找到
  3. 则委托给Extension加载器,在Extension的缓存中找,若是找到则返回,若还是没有找到
  4. 则委托给Bootstrap加载器,在Bootstrap的缓存中找,若是找到则返回,若还是没找到 则此时整个类加载器中都没有这个class文件,需要加载
  5. Bootstrap判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托Extension加载器加载
  6. Extension加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托App加载器加载
  7. App加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则委托CustomClassLoader加载器加载
  8. CustomClassLoader加载器判断自己是否应该加载这个class,若是,则加载并返回,若不是则抛出异常ClassNotFoungException

3.2 为什么需要双亲委派机制呢?

主要是为了安全,其次是为了防止资源浪费。

若是没有双亲委派机制,java.lang.Sting由自定义加载器加载,并且java.lang.Sting是自定义的只是名字相同,其中的方法若有危险,盗取密码等,则不能保证安全。