Java类文件结构及类加载机制

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 该文章主要讨论了Java类文件的结构以及Java类的加载机制,并提到了双亲委派模型的相关内容。

计算器只认识0和1,那么我们写的java代码是怎么被操作系统识别并执行的呢?

其实这里就是虚拟机起了很多作用了,JVM定义了一套字节码规范,只要符合虚拟机规范的字节码就可以被虚拟机识别,加载,执行 ,class文件就是字节码的来源,JVM通过 ,可见CLASS文件是JVM平台的基石。

class文件结构是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件之中,中间没有任何分隔符。

包含两种数据结构:

1、无符号数:基本的数据类型,以u1,u2,u4,u8代表1,2,4,8个字节的无符号数,用来描述数字,索引引用,数量值

2、表:由无符号数或者其他表作为数据项构成的复合数据类型,以_info结尾

u4 magic 魔术, 身份识别,是否可以被虚拟机接受

u2 minor_version 高版本可以兼任低版本 jdk1 以45为版本号

u2 major_version

cp_info 常量池 存储字面量和符合引用 类和接口全限定名 字段的名称和描述符 方法的名称和描述符

javap a.class javap命令可以查询class文件字节码

类加载机制

class文件格式了解了,但是这些class文件是怎么被虚拟机识别加载到内存的,这里会经历一些过程。

类加载生命周期:加载,验证,准备,解析,初始化,使用,卸载

加载:通过类全限定名进行获取二进制字节流

验证:文件格式,元数据,字节码,符号引用等验证

准备:为类变量分配类型并设置类初始值

解析:将符号引用替换成直接引用,包括类或接口的解析,字段解析,类方法解析,接口方法解析

初始化:当遇到new ,getstatic,puttstatic,invokestatic指令时进行初始化,方法中会对变量赋值或者静态代码块的初始化

静态代码块只能访问在静态代码块定义之前的变量,定义在它之后的变量可以赋值,但是不能访问,并且总是会先执行父类的方法

虚拟机天然保证在多线程下会正确执行,只会有一个线程同时执行

类加载机制:双亲委派模型

启动类加载器:加载java_home/lib下的jar文件

扩展加载器:加载java_home/lib/ext的jar文件

应用类加载器:加载用户类路径classpath下的类文件

双亲委派模型以组合关系来复用父类加载器代码。

工作过程:一个类加载器收到加载类请求时,首先会把加载请求委派父类加载器去完成,只有当父类加载器反馈自己加载不了当前请求的类,它才会自己去加载。如下图:

双亲委派机制好处:保证一个类只会被一个类加载器加载,保证了系统的稳定可靠性。使得java类有了一种层级关系。

破坏双亲委派机制的例子:

spi提供的接口的实现类启动器类无法加载,所以有了线程上下文类加载器,例如jdbc,jndi

相关文章
|
14天前
|
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
35 0
|
20天前
|
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
43 19
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
33 5
|
21天前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
47 11
|
14天前
|
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
23 1
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
|
11天前
|
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
|
5月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
233 58
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
83 7
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等