Java高级架构师-Java虚拟机知识点【class文件】

【深入Java虚拟机】之二:Class类文件结构 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各种变量、关键字和运算符的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更强大,这便为 阅读详情

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙。当遇到需要占用8位字节以上的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。

ClassFile 结构

ClassFile 结构说明

  1. magic:魔数。唯一作用是确定这个文件是否为一个能被虚拟机所接收的class文件。固定值:0xCAFEBABE。

  2. minor_version:class文件的副版本号。

  3. major_version:class文件的主版本号。

  4. constant_pool_count:常量池计数器。

  5. constant_pool[constant_pool_count]:常量池。包含字符串常量、类或接口名、字段名和其他常量。常量池每一项都具备相同特征,即第一个字节作为类型标记,用来确定该项格式。

  6. access_flags:访问标志。用于表示某个类或接口的访问权限及属性。

  7. this_class:当前的类索引。

  8. super_class:父类索引。

  9. interfaces_count:接口计数器。当前类或接口的直接超的接口数量。

  10. interfaces[interfaces_count]:接口表。

  11. fields_count:字段计数器。当前class文件的字段成员个数。

  12. fields[fields_count]:字段表。

  13. methods_count:方法计数器。方法的个数。

  14. methods[methods_count]:方法表。

  15. attributes_count:属性计数器。属性个数。

  16. attributes[attributes_count]:属性表。

一个例子

对下面的类进行编译生成Test2.class。

public class Test2 {
    public static int i = 1;
    public static void main() {
        System.out.println(i);
    }
}

通过十六进制查看工具打开Test2.class。

十六进制

根据 ClassFile 结构说明,前面4个字节是魔数oxcafebabe。接下来是次版本号和主版本号ox0000和ox0034,十进制为0和52,52表示JDK1.8,所以JDK版本是1.8.0。

还可以使用java自带的反编译工具来解析字节码文件。命令javap -v Test2.class。

Classfile /E:/CODE/JVM/Test2.class
  Last modified 2019-7-19; size 219 bytes
  MD5 checksum 841c66674d71005bc6a97fe6c3b0fb1d
  Compiled from "Test2.java"
public class Test2
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #4.#13         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#14         // Test2.i:I
   #3 = Class              #15            // Test2
   #4 = Class              #16            // java/lang/Object
   #5 = Utf8               i
   #6 = Utf8               I
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               SourceFile
  #12 = Utf8               Test2.java
  #13 = NameAndType        #7:#8          // "<init>":()V
  #14 = NameAndType        #5:#6          // i:I
  #15 = Utf8               Test2
  #16 = Utf8               java/lang/Object
{
  public int i;
    descriptor: I
    flags: ACC_PUBLIC

  public Test2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_1
         6: putfield      #2                  // Field i:I
         9: return
      LineNumberTable:
        line 1: 0
        line 2: 4
}
SourceFile: "Test2.java"

Java虚拟机限制

  • 每个类或接口的常量池最多65535个。
  • 类或接口中可声明的字段数最多65535个。
  • 类或接口中可声明的方法数最多65535个。
  • 类或接口的直接父类接口最多65535个。
  • 方法调用时创建的栈帧,其局部变量表中的最大局部变量数位65535个。
  • 方法帧中操作数栈的最大深度为65535。
  • 方法的参数最多255个。
  • 字段和方法名称、字段和方法描述符以及其他常量字符串值的最大长度为65535个字符。
  • 数组的维度最大为255维。

 

QQ交流群: 点击 有任何问题可以加群交流   

Java最新一线架构技术讲解请:点击 内容实用 讲解简单易懂

Java虚拟机知识点:Class文件编程 在进行Class文件编程时,建议参考相关的文档和书籍,以充分理解Java虚拟机的规范和相关工具的使用方法。Class文件是Java虚拟机的一种重要数据结构,它包含了Java程序的字节码指令和相关的元数据信息。在本文中,我们将探讨如何进行Class文件的编程,包括如何创建、读取和修改Class文件。上述代码通过读取Class文件的字节码数据,使用自定义的类加载器加载Class文件,并获取了类的名称和父类的名称。然后,它调用了Class文件中名为。然后,它将新的类写入了Class文件中,覆盖了原有的内容。 阅读详情

相关推荐

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 531

到底是什么决定了二极管的最高工作频率?

硬件工程师,应该都用过二极管的吧,不过也许有一个误区,大多数人可能并不知道,或者说是理解有问题,下面就来细细说下。 一个问题 先提一个问题:到底是什么决定了二极管的最高工作频率? 估计有不少人会回答是二极管反向恢复时间Trr,也有人会说是二极管结电容,那到底谁是对的呢?或者说都一样,反向恢复时间由结电容决定? 到底什么决定了二极管的最高工作频率,我们暂且不论,不过需要知道的是,二极管的反向恢复时间和结电容根本就是两回事,反向恢复时间绝不能等同于结电容的充放电时间。 为什么我这么说呢?.

weixin_42005993的博客 4832

Java虚拟机基础知识整理

JVM基础知识

努力学习Java的彬彬的博客 841

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 320

Python从0到100(一):初识Python及安装Pycharm

Python从0到100(一):初识Python及安装Pycharm。Python是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户群体的编程语言。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 8万+

6.JVM基础-类文件结构(一)—— Class类文件结构

Java 源代码首先需要使用 Javac 编译器编译成 .class 文件,然后由 JVM 执行 .class 文件,从而程序开始运行。 JVM 只认识 .class 文件,它不关心是何种语言生成了 .class 文件,只要 .class 文件符合 JVM 的规范就能运行。目前已经有 JRuby、Jython、Scala 等语言能够在 JVM 上运行。它们有各自的语法规则,不过它们的编译器都能将...

Willson_L的博客 569

杰理 JL701N/JL703N USB MIDI 使用教程

摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。

qq_42014563的博客 1265

JVM笔记5:Class文件结构

Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙。当遇到需要占用超过8位字节以上空间的数据项目时,会按照高位在前的方式分割为多个8位字节进行存储 数据项目分为2种基本数据类型(以...

weixin_30502157的博客 408

【图像去噪】基于加权核范数最小化算法实现图像去噪附matlab代码

1 简介 WNNM是一种约束矩阵奇异值稀疏性的低秩算法,在NNM理论基础上增加了核范数权重,有效利用了自然图像的先验信息并提高了核范数的灵活性. 2 部分代码 ​clcclear allclose allnSig = 100;O_Img = double(imread('Monarch.png'));​randn('seed', 0);N_Img = O_Img + nSig* randn(size(O_Img)); ..

qq_59747472的博客 3114

代谢组数据分析(十五):基于python语言构建PLS-DA分类预测模型

本教程阐述典型代谢组学数据分析工作流程,用于二元分类结果的研究。流程主要步骤如下:首先从 Excel 表格导入代谢物与实验数据,接着基于汇总 QC 进行数据清洗。随后借助主成分分析可视化检查数据质量,再开展两类单变量统计。之后运用偏最小二乘判别分析(PLS - DA)实施多变量分析,此过程涵盖模型优化(对比 R2 与 Q2)、置换测试及明确模型预测指标、确定特征重要性、对模型预测数据进行可视化。最终将统计表格导出至 Excel 表格,完整呈现从数据导入到分析结果输出的全过程。

专注生信领域 2875

Java虚拟机支持的最大内存限制

Java虚拟机支持的最大内存限制 最近在开发Java的程序。本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的。现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样可以保证快速响应。我还在反复算内存,想想自己的数据量,现在刚开始的时候应该够了(我的机器是4G内存,虽然Windows就认3.5G,但是比起我现在的数...

weixin_30782331的博客 293

基于coze studio开源框架二次定制开发教程

CozeStudio是一站式AIAgent开发工具,支持大模型接入、智能体编排、工作流开发等功能。采用Golang+React技术栈,基于微服务架构设计。项目包含后端API、领域逻辑、前端应用等模块,支持自定义任务流节点开发。开发流程涵盖前后端节点定义、实现逻辑编写等步骤,提供完整的开发规范和参考文档。相比商业版,开源版本在功能上有所精简,但仍保留核心开发能力。

coding change your life 790

用go编写java虚拟机(一)class文件

写在前面用go写jvm的目的初识class文件魔数。

wangkai031的博客 1707

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java虚拟机如何加载Class文件

前面两篇博客,我详细的讲解下Java主动内存管理的一些情况,如果想要更深入的了解Java虚拟机的运行机制的话,我建议可以阅读下《深入理解Java虚拟机》这本书。而这篇博客主要记录的是Java虚拟机是如何把.class文件加载到内存,具体的加载过程是怎么样的呢?请看下面的详细讲解。 首先,必须得明白类加载机制大致原理:虚拟机把描述类的数据从CLASS文件加载到内存,并对数据进行校验,转换解析和

夕林守护的博客 3408

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Java虚拟机系列】- Class字节码文件结构

Class文件是一组以8字节为基础单位的二进制流,内无分隔符无空隙,对于需占用8字节以上空间的数据项,按照高位在前的方式分割为若干8字节进行存储(高位在前指高位字节在地址最低位来存储数据,SPARC、PowerPC大端存储,而x86小端存储)字节码是一种中间代码,由高级语言编译器编译而成,需要由特定虚拟机进一步编译为机器码,同样的字节码可以在支持相应虚拟机的任何平台运行,即平台无关性。常量池相当于Class文件里的资源仓库,是Class文件中与其他项目关联最多,占用Class文件空间最大的数据项目。

m0_68383079的博客 735

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java虚拟机之Class文件

Class文件是Java程序的二进制格式,全面描述Java类或者接口。每个Class文件只能描述一个Java类或者接口的全部信息。Class文件的特点:1. 8位字节的二进制流;2. 按照数据项顺序存储,高位在前;3. 数据项之间没有间隔。Java虚拟机是通过读取和解析Class文件来执行Java程序,但是其他一些语言可以编译成Class文件在Java虚拟机上运行。因此,Java虚拟机并不关心Cl

懒,是我追求的美德 1682

java虚拟机class存在哪_Java虚拟机 - Class类文件结构

平台无关性Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各种变量、关键字和...

weixin_30273229的博客 429

Java虚拟机知识点-class文件

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙。当遇到需要占用8位字节以上的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。 ClassFile 结构说明 magic:魔数。唯一作用是确定这个文件是否为一个能被虚拟机所接收的cla...

Qqun954715313的博客 198

《深入理解Java虚拟机:Java Class 文件结构》

重要性存储与执行基础:Class文件是Java程序在Java虚拟机上运行的基本存储格式,它包含了Java程序的类和接口的定义信息,是Java虚拟机执行引擎的输入。平台无关性保障:Java虚拟机通过读取Class文件来执行Java程序,而Class文件的平台无关性使得Java程序可以在不同的操作系统和硬件平台上运行,实现了“一次编写,到处运行”的目标。无关性特点语言无关性。

weixin_51105979的博客 718

《深入理解JAVA虚拟机笔记》Class文件格式、字节码指令

之所以要专门使用这样一个属性去记录泛型类型,是因为Java语言的泛型采用的是擦除法实现的伪泛型,字节码(Code属性)中所有的泛型信息编译(类型变量、参数化类型)在编译之后都通通被擦除掉。Code属性是Class文件中最重要的一个属性, 如果把一个Java程序中的信息分为代码(Code, 方法体里面的Java代码) 和元数据(Metadata, 包括类、 字段、 方法定义及其他信息) 两部分, 那么在整个Class文件里, Code属性用于描述代码, 所有的其他数据项目都用于描述元数据。

川峰的博客 1434

详解 Java 虚拟机的字节码 —— Class 文件的结构

详解 Java 虚拟机的字节码 —— class 文件的结构一   Java 虚拟机 一   Java 虚拟机 相信你在阅读这篇文章之前,一定或多或少对 Java 有所了解,你肯定经常听到 “ Java 是一门跨平台的语言” 、 “ Java 程序由 Java 虚拟机负责执行” 之类的话。 我们会选择一个开发环境来编写 Java 代码,例如我们使用 IntelliJ IDEA 编写了一个类文件 Demo.java ,点击 “运行” 按钮就可以执行该

大肥肥熊熊的技术空间 672

java虚拟机之class文件解读

java虚拟机之class文件解读 解读前提 我们知道,java的源码文件经过编译器的编译就得到了字节码文件,也就是class文件。我们一直以来,关心的都是源码文件。身为程序员的你,是否跟我一样好奇过class文件里面是什么,是否也打开过class文件,然后发现一堆看不懂的乱码而放弃。那么这篇博客就是介绍如何来解读class文件。 首先我们要知道class文件的内容是以二进制的格式存在的,这也就是...

匿迹 578

虚拟机夯实之路————Class类文件的结构

常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它还是在Class文件中第一个出现的表类型数据项目。无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式,这时候称这一系列连续的某一类型的数据为某一类型的“集合”。由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值。

weixin_52170347的博客 844

【虚拟机】深入理解java虚拟机【Java Class类文件结构】

java虚拟机【Java Class类文件结构】

xjavaxx的博客 923
上一篇: 一个经典面试题:如何保证缓存与数据库的双写一致性?
下一篇: SpringMVC面试题:什么是Servlet?
程序员杨过
博客等级 码龄7年 13粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值