前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试-类加载

Java面试-类加载

作者头像
颍川
发布2021-03-23 11:05:46
3370
发布2021-03-23 11:05:46
举报
文章被收录于专栏:颍川颍川

文章目录

类加载过程

任何程序都需要加载到内存才能与CPU进行交流.字节码.class文件统一需要加载到内存中,才能实例化类,而ClassLoader正是关键,它的使命就是提前加载.class文件到内存中. 在加载类时,使用双亲委派模型(朔源委派加载模型)

Java的类加载器是一个运行时核心基础设施模块,主要在启动之初进行类的Load Link Init,即加载 连接 初始化

类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。

加载(Load)

第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe 魔法数,常量池,文件长度,是否有父类等,然后创建对应类的java.lang.Class实例

连接

第二部,Link 阶段包括验证,准备,解析三个步骤。验证是更详细的校验,比如final是否合规,类型是否正确,静态变量是否合理等,准备阶段是为静态变量分配内存,并设定默认值,解析类和方法确保类之间的相互引用正确性,完成内存结构布局。

初始化

第三部,Init阶段执行类构造器方法,如果复制运算是通过其他类的静态方法完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。

类加载器是如何定位到具体的类文件并读取的?

类加载器类似原始部落结构,存在权利等级制度.

  • Bootstrap ClassLoader 最高一层是家族中威望最高的Bootstrap,他是JVM启动时创建的,通常有与操作系统相关的本地代码实现,是最根基的类加载器,负责装载最核心的Java类,比如Object,System,String 等,
  • platfrom ClassLoader(Extension ClassLoader) 第二层从JDK9后改为platfrom ClassLoader,即平台加载器,用以加载一些扩展的系统类,不如XML,加密,压缩相关功能,JDK9之前是Extension ClassLoader,
  • Application ClassLoader 第三层是Application ClassLoader的应用类加载器,主要加载用户定义的CALSSPATH路径下的类。第二,第三层类加载器为Java语言实现,用户也可以自定义类加载器。

类加载规则

低层次的当前类加载器,不能覆盖更高层类加载器已经加载的类.

如果低层次的类加载器想要加载一个未知类,需要先向上询问,该未知类是否已经加载.

高层类加载器执行两个步骤, 第一 查询自身是否已经加载过此类, 第二 如果没有,是否可以加载此类

只有当所有高层类加载器在这两个问题的回答都是否的时候,才可以有当前类加载器加载这个未知类

什么时候需要自定义类加载器

  1. 隔离加载类
  2. 修改类加载方式
  3. 扩展加载源
  4. 防止源码泄露
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 类加载过程
    • 加载(Load)
      • 连接
        • 初始化
        • 类加载器是如何定位到具体的类文件并读取的?
        • 类加载规则
        • 什么时候需要自定义类加载器
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档