广告
返回顶部
首页 > 资讯 > 精选 >JVM中Java字节码文件的示例分析
  • 682
分享到

JVM中Java字节码文件的示例分析

2023-06-02 15:06:32 682人浏览 泡泡鱼
摘要

小编给大家分享一下JVM中Java字节码文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每一个class字节码文件都唯一对应一个类或接口,class文

小编给大家分享一下JVM中Java字节码文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象。

JVM中Java字节码文件的示例分析

字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,方法数量及方法表,sjz.java.tedu.cn属性属性及属性表,jvm中使用类c结构体表示每一种属性,结构体中类型种类有两种,无符号数及表,以 _info结尾表示表,以 u1,u2,u4,u8分别表示1字节,2字节,4字节,8字节无符号数

ClassFile{

u4 magic;

u2 minor_version;

u2 major_version;

u2 constant_pool_count;

cp_info constant_pool[constant_pool_count];

u2 acc_flags;

u2 this_class;

u2 super_class;

u2 interfaces_count;

u2 interfaces[interfaces_count];

u2 fields_count;

field_info fields[fields_count];

u2 methods_count;

method_info methods[methods_count];

u2 attributes_count;

attribute_info attributes[attributes_count];

}

魔术:四个字节,用于定义此字节码文件是否符合虚拟机规范,保证字节码文件不会威胁虚拟机的安全,若为cafebabe则表示字节码符合虚拟机规范

主次版本号:四个字节,前两字节表示次版本号,后两字节表示主版本号,用于定义编译的字节码文件格式版本,低版本虚拟机拒绝运行高版本字节码文件,但高版本虚拟机会向下兼容低版本字节码文件

常量池数量及常量池表:这部分主要统计类或接口的字面量和符号引用,用于每个类或接口拥有的字面量和符号引用属性不一定相同,所有需要两个字节的长度来表示常量池数目,常量池数目计数从1开始,比如类或接口中总共有两个字面量符号引用,则常量池数目为2,注意,不是从0开始计数,0可能另有用处,可以用来表示类或接口中未出现的引用,用来表示超级父类java.long.Object全限定名的索引,常量池表是一个数组,一共有18种类型,每一种类型有一个tag属性与之对应,constant_utf8_info用于表示文本字符串,类和接口全限定名,字段名称及描述符,方法名称及描述符等常量信息,constant_integer_info用于存储int类型的常量信息,只存储int类型的值,不存储其他符合引用信息,比如 final int a=1 符号引用信息为a,值为1,constant_float_info用于存储float类型常量信息,也是只存储float值,不存储引用信息,constant_long_info用于存储long类型的常量信息,constant_double_info用于存储double类型的常量信息,constant_class_info用于存储指向常量池列表constant_unf8_info类和接口全限定名的有效引用,constant_string_info用于存储指定常量池列表constant_utf8_info某常量项的有效索引,指向文本字符串,constant_fieldref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_methodref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_interfacemethodref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_nameandtype_info用于存储指向常量池列表constant_utf8_info常量项的有效索引,可以通过所有找到对应类及描述符,constant_methodtype_info用于存储指向常量池constant_utf8_info常量项,表示方法类型,找到对应的方法描述符,constant_methodhandle_info用于表示方法句柄,属性reference_kind表示方法句柄的类型,1-4表示为字段创建的方法句柄,5-8表示为类方法(构造、实例、静态)创建的句柄,9表示为接口方法创建的句柄,reference_index属性指向根据reference_kind对应的常量池列表,constant_invokedynamic_info用于存储当前字节码文件中引导方法bootstrap_method数组的有效索引和指向常量池constant_nameandtype_info常量项的有效索引

constant_utf8_info{

u1 tag;

u2 length;

u1 bytes[length];

}

constant_integer_info{

u1 tag;

u4 bytes;

}

constant_float_info{

u1 tag;

u4 float;

}

constant_long_info{

u1 falg;

u8 long;

}

constant_double_info{

u1 tag;

u4 double;

}

constant_class_info{

u1 tag;

u2 name_index;

}

constant_string_info{

u1 tag;

u2 string_index;

}

constant_fieldref_info{

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

constant_mathodref_info{

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

constant_interfacemathodref_info{

u1 tag;

u2 class_index;

u2 name_and_type_index;

}

JVM中Java字节码文件的示例分析

constant_nameandtype_info{

u1 tag;

u2 class_index;

u2 descriptor_index;

}

constant_methodhandle_info{

u1 tag;

u2 reference_kind;

u2 reference_index;

}

constant_methodtype_info{

u1 tag;

u2 descriptor_index;

}

constant_invokedynamic_info{

u1 tag;

u2 bootstrap_method_attr_index;

u2 name_and_type_index;

}

访问标志:两个字节,用于定义字节码文件所表示的类或接口的访问权限,如判断是类还是接口,类是否被abstract修饰,类是否被final修饰, acc_interface表示是接口,acc_annotation表示是注解类型,acc_enum表示是枚举类型,acc_public 表示类或接口是public访问权限,acc_final表示类不允许被继承,acc_abstract表示类为抽象类,acc_super表示类调用实例方法时需进行特殊操作

类索引及父类索引:四个字节,用于存储指向常量池constant_class_info对应的有效索引,而constant_class_info存储常量池列表的constant_utf8_info常量项索引,根据此索引可找到类和父类的全限定名

接口数量及接口表:接口属性用于存储当前类或接口的直接超类接口数量,接口表是一个数组,记住,只有常量池表从1开始计数,其余都是从数组下表0开始计数,接口表数组的每一个数组元素存储此类或接口的直接超类接口的有效索引,根据此索引找到constant_class_info对应的常量项,根据constant_class_info可找到对应直接超类接口的全限定名

字段数量及字段表:字段数量用于存储类或接口的字段数目,包括类字段和实例字段,字段表为一个数组,每一个数组元素都相当于一个field_info结构的对象,field_info结构包含字段完整信息:字段标识符,字段访问修饰符,字段是类字段还是实例字段,字段是否为常量等,注意:此处字段表示当前类或接口的字段,不包括从超类或接口继承的字段,java语法规范不允许同一个类或接口中出现同一字段名的不同字段,但是class文件中却可以允许出现相同字段名的不同字段,只有字段的描述符不同即可,field_info结构属性:access_flags用于存储字段的访问标志,acc_private,acc_protected,acc_public,acc_final,acc_static,acc_volatile等,注意:acc_final与acc_volatile不能同时出现在同一字段,name_index指向常量池constant_utf8_info常量项的有效索引,获取当前字段的简单名称,descriptor_index指向常量池constant_utf8_info常量项的有效索引,获取当前字段的描述符,attribute_count,attributes[attributes_count]这两项表示字段的属性信息,用于描述字段相关信息,attribute数组每一个元素都是一个attribute_info结构的元素

field_info{

u2 access_flags;

u2 name_index;

u2 descriptor_index;

u2 attributes_count;

attribute_info attributes[attribuyes_count];

}

方法数量及方法表:方法数量用于存储当前类或接口的方法数目,包括实例方法,类方法,抽象方法,方法表是一个数组,每一个数组元素都是一个method_info结构,method_info结构包含方法的完整信息:方法描述符,访问修饰符,是否为final方法,是否为abstract方法等,注意:此处的方法数组只是表示当前类或接口的所有方法,并不包括从超类及父接口继承来的方法,java语法规范java类或接口中不允许出现方法签名完全一样的方法同时出现,会编译报错,而字节码层面却允许方法签名完全相同的方法同时出现,只需要保证方法的返回值类型不同,method_info结构属性与field_info一致,但acc_flags类型不尽相同,注意acc_abstract不能与acc_final,acc_static,acc_private,acc_synchronized,acc_native同时使用,接口方法中只能使用acc_public,acc_abstract,此处我有一个疑问,接口中default方法有没有对应的访问标志,注意:方法只能使用acc_private,acc_protected,acc_public访问标志

method_info{

u2 access_flags;

u2 name_index;

u2 descriptor_index;

u2 attributes_count;

attribute_info attributes[attribuyes_count];

}

属性数量及属性表:属性数量表示当前字节码文件中attribute_info表数目,属性表是一个数组,每一个数组元素都是attribute_info结构,attribute_info结构表示属性的完整信息:第一项指向常量池constant_utf8_info某常量项的有效索引,根据此索引可找到属性对应名称,属性可以出现在classFile,字段表,方法表中,用以描述相关信息,attribute_info结构完整信息:attribute_name_index指向常量池constant_utf8_info常量项的有效索引,获取属性名称,attribute_length用于指明info数组长度,info[attribute_length]用于存储属性的数据信息,必须实现的数据信息:Code,ConstantValue,Exceptions, code属性用于描述method_info的具体相关信息,attribute_name_index指向常量池constant_utf8_info常量项的有效索引,获取属性名称,即code,attribute_length表示attribute表示attribute_info长度,不包括attribute_name_index和attribute_length的初始6字节,max_stack描述当前方法最大栈深度,max_locals描述当前方法的局部变量表,code_length表示code数组长度,code[]表示当前方法编译后的字节码, ContantVaue位于field_info结构中,用于通知虚拟机对类变量进行初始化,即字段需要被acc_static修饰,当前类常量不需要ContantValue通知虚拟机执行初始化,早就执行好了,实例字段此时不需要初始化

attribute_info{

u2 attribute_name_index;

u4 attribute_length;

u1 info[attribute_length];

}

code_attribute{

u2 attribute_name_index;

u4 attribute_length;

u2 max_stack;

u2 max_locals;

u4 code_length;

u1 code[code_length];

u2 exception_table_length;

exception_info exception_table[exception_table_length];

u2 attributes_count;

attribute_info attributes[attributes_count];

}

constantvalue_attribute{

u2 attribute_name_index;

u4 attribute_length;

u2 constantvalue_index;

}

简单名称与描述符:

简单名称是指字段或方法的简单的一种描述,比如person class:private String name字段简单名称为name,Object class:public String toString()方法简单名称为toString,注意:字段或方法简单名称不允许出现 . : / [ 等ASSIC或Unicode字符表示形式

描述符一般指字段或方法的类型,字段描述符表示字段类型描述,方法描述符表示参数描述与返回值描述,如:person class:private String name字段描述符为Ljava.lang.String,com.test.Person class:setName(String name)方法描述符为(Ljava.lang.String)V,注意:其中V表示返回值为void类型,如果参数为void则表示为()Ljava.lang.Object,表示无参的返回值为java.lang.Object引用类型的方法描述符

字段描述符解释:B byte 字节类型,Z boolean 布尔类型,C char 字符类型,S short 短整型,I 整型,L long 长整型,F float 单进度浮点类型,D double 双精度浮点类型,L reference 对象引用类型,[ reference 数组引用类型

以上是“JVM中Java字节码文件的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: JVM中Java字节码文件的示例分析

本文链接: https://www.lsjlt.com/news/230459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM中Java字节码文件的示例分析
    小编给大家分享一下JVM中Java字节码文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每一个class字节码文件都唯一对应一个类或接口,class文...
    99+
    2023-06-02
  • java之JVM字节码结构的示例分析
    这篇文章主要介绍了java之JVM字节码结构的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常用的java框架有哪些1.SpringMVC,Spring Web MV...
    99+
    2023-06-14
  • Java字节码实例分析
    这篇文章主要讲解了“Java字节码实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java字节码实例分析”吧!一:Java字节代码的组织形式类文件{OxCAFEBABE,小版本号,大版...
    99+
    2023-06-17
  • java IO中字节和字符的示例分析
    这篇文章给大家分享的是有关java IO中字节和字符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
    99+
    2023-06-14
  • Java中char字节占用的示例分析
    这篇文章给大家分享的是有关Java中char字节占用的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
    99+
    2023-06-14
  • java中jvm关闭的示例分析
    这篇文章给大家分享的是有关java中jvm关闭的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序...
    99+
    2023-06-14
  • jvm细节探索之synchronized的示例分析
    这篇文章主要介绍了jvm细节探索之synchronized的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的...
    99+
    2023-05-30
    jvm synchronized
  • python源文件中字符编码的示例分析
    这篇文章将为大家详细讲解有关python源文件中字符编码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyth...
    99+
    2023-06-14
  • Java IO中字节输入输出流的示例分析
    这篇文章主要介绍Java IO中字节输入输出流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内...
    99+
    2023-06-26
  • Java中IO操作字节流与字符流的示例分析
    这篇文章主要为大家展示了“Java中IO操作字节流与字符流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO操作字节流与字符流的示例分析”这篇文章吧。IO操作字节流java....
    99+
    2023-06-29
  • jvm中java内存模型的示例分析
    这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存...
    99+
    2023-06-19
  • Java面试题之JVM的示例分析
    这篇文章给大家分享的是有关Java面试题之JVM的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的?该问题主要针对你遇到的实际问题出发,可以根据你...
    99+
    2023-06-20
  • 在mysql中宽字节注入的示例分析
    这篇文章将为大家详细讲解有关在mysql中宽字节注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在mysql中,用于转义的函数有addslashes,mysql_real_escape_s...
    99+
    2023-06-17
  • java之JVM架构模型的示例分析
    小编给大家分享一下java之JVM架构模型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2....
    99+
    2023-06-14
  • java之JVM各类机制的示例分析
    这篇文章将为大家详细讲解有关java之JVM各类机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户...
    99+
    2023-06-14
  • JVM中GC调优的示例分析
    小编给大家分享一下JVM中GC调优的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!那些GC的默认值其实GC或者说JVM的参数非常非常的多,有控制内存使用的:有控制JIT的:有控制分代比例的,也有控制GC并发的:当然...
    99+
    2023-06-15
  • java虚拟机原理:Class字节码二进制文件分析
    目录一、字节码文件 与 JVM二、字节码文件示例三、字节码文件二进制结构分析1、魔数 2、次版本号 3、主版本号 4、常量池个数 总结一、字节码文件 与 JVM Java 源码编译成...
    99+
    2022-11-12
  • java中的char占几个字节实例分析
    java中的char占几个字节实例分析       1:“字节”是byte,“位”是bit ;  2: 1 byte = 8 bit ;  char 在Java中是2个字节。jav...
    99+
    2023-05-31
    java char 字节
  • JavaScript中节流的示例分析
    小编给大家分享一下JavaScript中节流的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言我们来聊一聊节流——另一个优化函数的思想。我们还是以移动事...
    99+
    2023-06-06
  • Java和IDEA中文件打包的示例分析
    这篇文章主要介绍Java和IDEA中文件打包的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题:想在IDEA中引用相对路径,但是找不到文件。项目目录结构当前项目的路径为:D:\source\java\tes...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作