当前位置: 首页 > news >正文

Java类加载器实现机制详细笔记

1. 类加载器的基本概念
  • 类加载器(ClassLoader):在Java中,类加载器负责将Java类动态加载到JVM中。它是实现动态类加载机制的核心组件,对于开发复杂应用程序(如插件系统、模块化设计等)至关重要。
2. 类加载过程
  • 加载(Loading):从文件系统或网络读取.class文件,创建包含类数据的Class对象。
  • 链接(Linking):将类的二进制数据合并到JVM中,包括:
    • 验证(Verification):确保类文件符合JVM规范。
    • 准备(Preparation):为静态变量分配内存并初始化默认值。
    • 解析(Resolution):将符号引用替换为直接引用。
  • 初始化(Initialization):为静态变量赋予正确的初始值,并执行静态代码块。
3. 双亲委派模型
  • 模型概述:Java类加载器遵循双亲委派模型(Parent Delegation Model),确保核心类库的加载安全性,避免类冲突。
  • 工作机制:类加载器收到类加载请求时,先委托给父类加载器,父类加载器找不到时,再自行加载。
4. 类加载器层次结构
  • Bootstrap ClassLoader:最顶层的类加载器,用本地代码实现,负责加载核心Java类库(如java.lang.*)。
  • Extension ClassLoader:加载扩展目录(JAVA_HOME/lib/ext)中的类。
  • Application ClassLoader:加载系统类路径(classpath)下的类,是默认的类加载器。
5. 常见类加载器
  • Bootstrap ClassLoader:由JVM实现,加载JRE核心类库。
  • Extension ClassLoader:继承自ClassLoader类,加载扩展目录中的类。
  • Application ClassLoader:继承自ClassLoader类,加载用户类路径下的类。
6. 自定义类加载器
  • 应用场景
    • 插件系统:动态加载和卸载插件,避免类冲突。
    • 热部署:不重启应用更新代码。
    • 隔离环境:隔离不同组件或模块。
    • 从非标准源加载类:如数据库、网络、加密文件。
    • 安全考虑:加载加密的类文件并解密。
7. 自定义类加载器示例
  • 示例代码
    public class CustomClassLoader extends ClassLoader {private String classPath;public CustomClassLoader(String classPath) {super(null); // 不使用默认父类加载器this.classPath = classPath;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name);if (classData == null) {throw new ClassNotFoundException();} else {return defineClass(name, classData, 0, classData.length);}}@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {if (name.startsWith("java.")) {return super.loadClass(name); // 委托给Bootstrap ClassLoader加载}try {return findClass(name); // 尝试自己加载类} catch (ClassNotFoundException e) {return super.loadClass(name); // 如果失败,委托给父类加载器}}private byte[] loadClassData(String className) {String filePath = classPath + className.replace('.', '/') + ".class";try (InputStream inputStream = new FileInputStream(filePath);ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {int nextValue;while ((nextValue = inputStream.read()) != -1) {byteStream.write(nextValue);}return byteStream.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}}public static void main(String[] args) {String classPath = "path_to_classes/";CustomClassLoader customClassLoader = new CustomClassLoader(classPath);try {Class<?> clazz = customClassLoader.loadClass("com.example.MyClass");Object instance = clazz.newInstance();System.out.println(instance.getClass().getName());} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}
    }
    
8. 字节码校验
  • 文件格式校验
    • 检查文件头的魔数:0xCAFEBABE。
    • 验证版本号。
    • 检查常量池。
  • 元数据校验
    • 访问标志、继承关系、字段和方法描述符。
  • 字节码校验
    • 操作数栈校验、局部变量表校验、类型检查、控制流检查。
  • 符号引用校验
    • 类引用、字段和方法引用。
  • 权限校验
    • 字段和方法访问权限。
9. 魔数的重要性
  • 魔数:Class文件的前四个字节,值为0xCAFEBABE。
  • 作用:标识文件类型,防止误处理其他类型文件,确保后续解析和校验的正确性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Stable Diffusion WebUI本地环境搭建
  • kafka详解及应用场景介绍
  • 当你在浏览器扣下域名时。。。
  • (自适应手机端)行业协会机构网站模板
  • 系统模块时序图的重要性:解锁系统模块交互的全景视图
  • 【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)
  • 哪些地区适合作EOD项目?
  • 如何选择合适的自动化测试工具!
  • 大数据-55 Kafka sh脚本使用 与 JavaAPI使用 topics.sh producer.sh consumer.sh kafka-clients
  • 昇思25天学习打卡营第XX天|基于MindSpore的红酒分类实验
  • flink standakone提交任务参数
  • 现在的Java面试都这么扯淡了吗?
  • 2024下《网络工程师》案例简答题,刷这些就够了!
  • linux timestamp
  • 【吊打面试官系列-Dubbo面试题】Dubbo SPI 和 Java SPI 区别?
  • 11111111
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • classpath对获取配置文件的影响
  • create-react-app项目添加less配置
  • extjs4学习之配置
  • JavaScript函数式编程(一)
  • LeetCode29.两数相除 JavaScript
  • Promise初体验
  • Python利用正则抓取网页内容保存到本地
  • WePY 在小程序性能调优上做出的探究
  • 测试如何在敏捷团队中工作?
  • 翻译:Hystrix - How To Use
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端临床手札——文件上传
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 手机端车牌号码键盘的vue组件
  • 写代码的正确姿势
  • 学习ES6 变量的解构赋值
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个JAVA程序员成长之路分享
  • 《天龙八部3D》Unity技术方案揭秘
  • Android开发者必备:推荐一款助力开发的开源APP
  • Spring Batch JSON 支持
  • ​Spring Boot 分片上传文件
  • # dbt source dbt source freshness命令详解
  • #《AI中文版》V3 第 1 章 概述
  • #QT 笔记一
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (0)Nginx 功能特性
  • (k8s)Kubernetes本地存储接入
  • (第27天)Oracle 数据泵转换分区表
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (七)Activiti-modeler中文支持
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (自适应手机端)行业协会机构网站模板