博客
关于我
ClassLoader、双亲委派机制、自定义类加载器实践
阅读量:397 次
发布时间:2019-03-05

本文共 1207 字,大约阅读时间需要 4 分钟。

ClassLoader、双亲委派机制、自定义类加载器

双亲委派模型是Java类加载机制中的一个核心原理,它确保了类的加载安全性和唯一性。以下是对这一机制的详细分析:

  • 双亲委派机制的工作原理

    • 当一个类加载器要加载某个类时,它会首先询问其上级类加载器(父类加载器)是否已经加载了该类。
    • 如果上级已经加载了该类,当前类加载器就不需要再去处理这个类,直接返回已加载的类。
    • 如果上级没有加载过,该类加载器会继续向上级的父类加载器请求,直到顶层的Bootstrap ClassLoader。
    • 如果在整个过程中找到了该类的定义,加载过程就停止,否则会抛出ClassNotFoundException。
    • 重要的是,如果一个类已经被加载过,就不会再次尝试加载,从而避免了重复加载带来的问题。
  • 类加载器的层级结构

    • Bootstrap ClassLoader(启动类加载器):负责加载Java核心类和rt.jar中的类,通常位于$JAVA_HOME/jre/lib/rt.jar。
    • Extension ClassLoader(扩展类加载器):负责加载扩展目录$JAVA_HOME/jre/lib/ext/下的jar文件。
    • Application ClassLoader(应用类加载器):负责加载应用程序的类路径(-jarpath或-classpath)。
    • User ClassLoader(用户类加载器):由开发者自定义,通常用于定制加载逻辑,例如加密类文件或读取特定目录中的类。
  • 双亲委派的优势

    • 安全性:确保核心类库无法被自定义类加载器覆盖,防止潜在的安全风险。例如,自定义类加载器尝试加载java.lang开头的类时,会抛出SecurityException。
    • 避免重复加载:已加载的类不会重复加载,减少内存占用和逻辑混乱。
  • 自定义类加载器的实现

    • 要自定义类加载器,必须继承ClassLoader类,并覆盖findClass方法。
    • 例如,MyClassLoader2类读取指定路径下的class文件,并使用defineClass方法定义类。
    • 注意:传统的defineClass方法已过时,建议使用带有name参数的方法,以便通过类路径加载类。
  • 实践中的挑战与思考

    • 定义java.lang类:尝试定义自己的java.lang.String或Object类时,会发现这些类会被Bootstrap ClassLoader优先加载,确保了系统的稳定性。
    • 自定义类在扩展目录中的加载:如果将自定义类打包到jre/lib/ext目录中,Extension ClassLoader会优先加载这些类,确保不会使用应用类加载器中的类。
    • 测试与验证:通过编写测试类,验证自定义类加载器是否能够正确加载自定义类,并确保双亲委派机制的正确性。
  • 通过理解双亲委派机制和自定义类加载器的实现,可以更好地掌握Java的类加载机制,灵活地进行类加载管理。

    转载地址:http://lkdzz.baihongyu.com/

    你可能感兴趣的文章
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>