• 面经-虚拟机-类加载


    类加载

    类加载过程

    1.加载

    ①将类的字节码载入方法区,并创建.class对象。

    ②如果此类的父类没有加载,先加载父类。

    ③加载是懒惰执行。

    2.链接

    ①验证-验证类是否符合字节码规范,合法性、安全性检测。

    ②准备-为static变量分配空间,设置默认值。

    ③解析-将常量池的符号引用解析为直接引用。

    3.初始化

    ①执行静态代码块与非final静态变量赋值。

    ②初始化是懒惰执行。

    双亲委派

    双亲委派:优先委派上级类加载器进行加载,

    如果上级类加载器

    ①能找到这个类,则由上级加载,加载后该类也对下级加载器可见。

    ②找不到这个类,则下级类加载器才有资格执行加载,权力下放。

    下级类加载器加载的类对上级不可见。

    名称加载哪的类说明
    Bootstrap ClassLoader 启动类加载器JAVA_HOME/jre/lib无法直接访问
    Extension ClassLoader 扩展类加载器JAVA_HOME/jre/lib/ext上级为Bootstrap,显示为null
    Application ClassLoader 应用程序类加载器classpath上级为Extension
    自定义类加载器自定义上级为Application

    可以自己写一个java.lang.System吗

    不行。

    1.假设你自己的类用双亲委派,那么优先由启动器加载真正的System。

    2.假设不用双亲委派,那么类加载器加载假冒的System时会先加载父类java.lang.Object,没有用委派的话找不到Object,会失败。

    3.实际操作中类加载器加载java打头的类,会抛安全异常。

    4.jdk9以上版本对特殊包名与模块绑定,编译不通过。


    双亲委派的目的

    1.让上级类加载器中的类对下级共享(反之不行),即能让你的类依赖到jdk提供的核心类。

    2.让类的加载有优先次序,保证核心类优先加载。

  • 相关阅读:
    怎样学好java
    【Spring boot 集成 Fliter 和 Linstener】
    worthington酶活性研究丨worthington pH值的影响
    异步FIFO设计的仿真与综合技术(2)
    学习Python的经历和一些经验分享
    ubuntu安装samba文件共享
    免费开源 | 基于SSM的校园订餐系统
    华为云云耀云服务器L实例评测|在云耀云服务器L实例上部署经典小游戏battle-city坦克大战
    C++11并发编程-线程的启用与销毁
    概率公式c的计算
  • 原文地址:https://blog.csdn.net/LYly_B/article/details/126550365