北京平台网站建设费用做一个网站成本是多少合适
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:00
当前位置: 首页 > news >正文
北京平台网站建设费用,做一个网站成本是多少合适,广东企业网站模板推荐,wordpress 快速评论插件深入浅出JVM#xff08;四#xff09;之类文件结构
Java文件编译成字节码文件后#xff0c;通过类加载机制到Java虚拟机中#xff0c;Java虚拟机能够执行所有符合要求的字节码#xff0c;因此无论什么语言#xff0c;只要能够编译成符合要求的字节码文件就能够被Java虚拟…深入浅出JVM四之类文件结构
Java文件编译成字节码文件后通过类加载机制到Java虚拟机中Java虚拟机能够执行所有符合要求的字节码因此无论什么语言只要能够编译成符合要求的字节码文件就能够被Java虚拟机执行
Java虚拟机和字节码是语言、平台无关性的基石
本篇文章将深入浅出的解析字节码文件
无关性的基石
曾经: 源代码-经过编译-本地机器码
Java: 源代码-经过编译-字节码 - 解释器 - 本地机器码 字节码: 与操作系统和机器指令集无关的,平台中立的程序编译后的存储格式 字节码是无关性的基石 平台无关性的基石:
所有平台都统一支持字节码不同的Java虚拟机都可以执行平台无关的字节码
因此实现了 一次编译,到处运行
语言无关性的基石:
Java虚拟机字节码
Java虚拟机不是只可以执行Java源代码编译而成的字节码,只要符合要求(安全…)的字节码,它都可以执行
因此Kotlin…等语言可以运行在Java虚拟机上
Class类文件结构 文件格式存取数据的类型 无符号数 : u1,u2,u4,u8代表1,2,4,8个字节的无符号数(可以表示数字,UTF-8的字符串,索引引用….)表: 由n个无符号数或n个表组成(命名以_info结尾)
初识Class文件格式 编写Java源代码 public class Test {private int m;private final int CONSTANT111;public int inc() throws Exception {int x;try {x 1;return x;}catch (Exception e){x 2;return x;}finally{x 3;}}} 使用可视化工具classpy查看反编译的结果 每个集合前都有一个计数器来统计集合中元素的数量 Class文件格式的描述 数据类型名称数量对应图中名字作用u4magic1魔数确定这个文件是否是一个能被虚拟机接受的Class文件u2minor_version1次版本号虚拟机必须拒绝执行超过其版本号的Class文件u2major_version1主版本号虚拟机必须拒绝执行超过其版本号的Class文件u2constant_pool_count1常量池容量计数器统计常量数量cp_infoconstant_poolconstant_pool_count - 1常量池存放常量u2access_flags1访问标志识别类(类,接口)的访问信息u2this_class1类索引确定类的全限定名u2super_class1父类索引确定父类的全限定名u2interfaces_count1接口计数器统计该类实现接口数量u2interfacesinterfaces_count接口索引集合描述该类实现了的接口u2fields_count1字段表集合计数器统计类的字段数量field_infofieldsfields_count字段表集合描述类声明的字段(类变量,实例变量)u2methods_count1方法表集合计数器统计类的方法数量method_infomethodsmethods_count方法表集合描述类声明的方法u2attribute_count1属性表集合计数器统计属性数量attribute_infoattributesattributes_count属性表集合描述属性
魔数与主次版本号
魔数: 确定这个文件是否为一个能被虚拟机接受的有效Class文件 主次版本号: 虚拟机拒绝执行超过其版本号的Class文件 不同版本的Java前端编译器编译生成对应的Class文件主次版本号不同支持高版本JVM执行低版本前端编译器生成的Class文件(向下兼容)拒绝低版本JVM执行高版本前端编译器生成的Clsss文件
常量池
常量池包含两大常量: 字面量和符号引用 符号引用与直接引用 符号引用 使用一组符号描述引用(为了定位到目标引用)与虚拟机内存布局无关还是符号引用时目标引用不一定被加载到内存 直接引用 直接执行目标的指针,相对偏移量或间接定位目标引用的句柄与虚拟机内存布局相关解析直接引用时目标引用已经被加载到内存中 字面量与符号引用 字面量 文本字符串被final声明的常量 符号引用 全限定名方法或字段的简单名称和描述符 图中的常量有我们代码中熟悉的常量也有很多没有显示出现在代码中的常量
访问标志
用于识别类或接口的访问信息
是否是一个接口,枚举,模块,注解…
是否被final(public,abstract…)修饰 ACC_PUBLIC:被public修饰
ACC_SUPER: 允许使用invokespecial字节码指令
类索引,父类索引与接口索引集合 类索引 用于确定本类的全限定名 类索引指向常量池中表示该类的符号引用 父类索引 用于确定父类的全限定名 父类索引指向常量池中表示该类父类的符号引用
除了Object外,所有类的父类索引都不为0 接口索引集合 描述这个类实现了哪些接口
我们的例子中没有实现接口,就没有(接口索引集合计数器为0) 总结 Class文件由 类索引,父类索引,接口索引集合 来确定该类的继承关系
字段表集合
描述类声明的字段
字段包括类变量和成员变量(实例变量),不包括局部变量 简单名称和描述符 简单名称 字段: 没有描述字段类型的名称方法: 没有描述参数列表和返回类型的名称 描述符 字段: 描述字段的类型 方法: 描述参数列表和返回值 描述符字符含义(long,boolean,对象类型是J,Z,L 其他都是首字母大写) 标识字符含义BbyteCcharDdoubleFfloatIintJlongSshortZbooleanVvoidL对象类型,如Ljava/lang/Object 描述符描述n维数组 在前面先写n个[ 再写标识字符 比如java.lang.Integer[ ] [Ljava.lang.Integer 描述符描述方法 参数列表按照从左到右的顺序写在()中 返回类型写到最后 比如String method(long[],int,String[]) ([JIL[java.lang.String)Ljava.lang.String
因此Class文件中字段描述符指向常量池中的#07 I 符号引用(的索引) 注意 字段表集合不会列出父类或父接口中声明的字段 只用 简单名称 来确定字段,所以不能有重名字段 用 简单名称 和 描述符 确定方法,所以方法可以重名(重载) 字节码文件 规定 简单名称描述符相同才是同一个方法但是 Java语法 规定 重载 简单名称相同 描述符的参数列表不同 描述符的返回类型不能不同
方法表集合
描述类声明的方法
与字段表集合类似 注意 方法表集合中不会列出父类方法信息(不重写的情况)
属性表集合
属性比较多,这里只说明我们例子中出现的,其他的会总结
用于描述某些场景专有信息
刚刚在字段,方法表集合中都可以看到属性表集合,说明属性表集合是可以被携带的 怎么没看到Java源代码中的代码呢? 实际上它属于属性表集合中的Code属性
Code属性
Java源代码中方法体中的代码经过编译后编程字节码指令存储在Code属性内 其中的异常表集合代表 编译器为这段代码生成的多条异常记录,对应着可能出现的代码执行路径
(程序在try中不抛出异常会怎么执行,抛出异常又会怎么执行….) Exceptions属性
列举出方法中可能抛出的检查异常(Checked Exception),也就是方法声明throws关键字后面的列举异常 LineNumberTable属性
描述Java源码行号与字节码指令行号(字节码偏移量)对应关系
SourceFile属性
记录生成此Class文件的源码名称
StackMapTable属性
虚拟机类加载验证阶段的字节码验证时,不需要再检验了,只需要查看StackMapTable属性中的记录是否合法
编译阶段将一系列的验证类型结果记录在StackMapTable属性中 ConstantValue
在类加载的准备阶段,为静态变量(常量)赋值
只有类变量才有这个属性
实例变量的赋值: 在实例构造器
类变量的赋值: 在类构造器 或 带有ConstantValue属性在类加载的准备阶段
如果类变量被final修饰(此时该变量是一个常量),且该变量数据类型是基本类型或字符串,就会生成ConstantValue属性,该属性指向常量池中要赋值的常量,在类加载的准备阶段,直接把在常量池中ConstantValue指向的常量赋值给该变量 总结所有属性
属性名作用Code方法体内的代码经过编译后变为字节码指令存储在Code属性中Exceptions列举出方法可能抛出的检查异常(Checked Exception)LineNumberTableJava源码行号与字节码偏移量(字节码行号)对应关系LocalVariableTableJava源码定义的局部变量与栈帧中局部变量表中的变量对应关系(局部变量名称,描述符,局部变量槽位置,局部变量作用范围等)LocalVariableTypeTable与LocalVariableTable相似,只是把LocalVariableTable的描述符换成了字段的特征签名(完成对泛型的描述)SourceFile记录生成这个Class文件的源码文件名称SourceDebugExtension用于存储额外的代码调式信息ConstantValue在类加载的准备阶段,为静态变量(常量)赋值InnerClasses记录内部类与宿主类之间的关系Deprecated用于表示某个字段,方法或类已弃用 (可以用注解deprecated表示)Synthetic用于表示某字段或方法不是由Java源代码生成的,而是由编译器自行添加的StackMapTable虚拟机类加载验证阶段的字节码验证时,不需要再检验了,只需要查看StackMapTable属性中的记录是否合法Signature记录泛型签名信息BootstrapMethods保存动态调用(invokeeddynamic)指令引用的引导方法限定符MethodParameters记录方法的各个形参名称与信息
javap解析Class文件
关于javac
javac xx.java 编译Java源文件,不会生成对应的局部变量表
javac -g xx.java 编译Java源文件,生成对应的局部变量表
idea中编译Java源文件使用的是javac -g
关于javap 常用 javap -v 基本上可以反汇编出Class文件中的很多信息(常量池,字段集合,方法集合…)
但是它不会显示私有字段或方法的信息,所以可以使用javap -v -p 详解javap -v -p public class JavapTest {private int a 1;float b 2.1F;protected double c 3.5;public int d 10;private void test(int i){i1;System.out.println(i);}public void test1(){String s test1;System.out.println(s);}} 最后不要白嫖一键三连求求拉~
本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~
有什么问题可以在评论区交流如果觉得菜菜写的不错可以点赞、关注、收藏支持一下~
关注菜菜分享更多干货公众号菜菜的后端私房菜 本文由博客一文多发平台 OpenWrite 发布
- 上一篇: 北京品牌建设网站公司金泉网做网站推广
- 下一篇: 北京企业官网网站建设十大电子游戏平台网站
相关文章
-
北京品牌建设网站公司金泉网做网站推广
北京品牌建设网站公司金泉网做网站推广
- 技术栈
- 2026年03月21日
-
北京南站在哪个街道网站名称备案
北京南站在哪个街道网站名称备案
- 技术栈
- 2026年03月21日
-
北京南站核酸检测地点济南网站优化费用
北京南站核酸检测地点济南网站优化费用
- 技术栈
- 2026年03月21日
-
北京企业官网网站建设十大电子游戏平台网站
北京企业官网网站建设十大电子游戏平台网站
- 技术栈
- 2026年03月21日
-
北京企业建站模板管理咨询公司组织架构
北京企业建站模板管理咨询公司组织架构
- 技术栈
- 2026年03月21日
-
北京企业建站哪家好人力资源网站建设方案
北京企业建站哪家好人力资源网站建设方案
- 技术栈
- 2026年03月21日






