首页 > 其他分享 >class字节码文件结构

class字节码文件结构

时间:2022-11-19 15:25:43浏览次数:48  
标签:info 文件 CONSTANT 字节 数据类型 u2 class ACC

class字节码文件结构

类型 名称 说明 长度 数量
u4 magic 魔数,识别Class文件格式 4个字节 1
u2 minor_version 副版本号(小版本) 2个字节 1
u2 major_version 主版本号(大版本) 2个字节 1
u2 constant_pool_count 常量池计数器 2个字节 1
cp_info constant_pool 常量池表 n个字节 constant_pool_count-1
u2 access_flags 访问标识 2个字节 1
u2 this_class 类索引 2个字节 1
u2 super_class 父类索引 2个字节 1
u2 interfaces_count 接口计数器 2个字节 1
u2 interfaces 接口索引集合 2个字节 interfaces_count
u2 fields_count 字段计数器 2个字节 1
field_info fields 字段表 n个字节 fields_count
u2 methods_count 方法计数器 2个字节 1
method_info methods 方法表 n个字节 methods_count
u2 attributes_count 属性计数器 2个字节 1
attribute_info attributes 属性表 n个字节 attributes_count

Class文件版本号和平台的对应

主版本(十进制) 副版本(十进制) 编译器版本
45 3 1.1
46 0 1.2
47 0 1.3
48 0 1.4
49 0 1.5
50 0 1.6
51 0 1.7
52 0 1.8
53 0 1.9
54 0 1.10
55 0 1.11

class文件数据类型

数据类型 定义 说明
无符号数 无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。 其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节
表是由多个无符号数或其他表构成的复合数据结构。 所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上个数说明。

类型描述符

标志符 含义
B 基本数据类型byte
C 基本数据类型char
D 基本数据类型double
F 基本数据类型float
I 基本数据类型int
J 基本数据类型long
S 基本数据类型short
Z 基本数据类型boolean
V 代表void类型
L 对象类型,比如:Ljava/lang/Object;
[ 数组类型,代表一维数组。比如:double[][][] is [[[D

常量类型和结构

类型 标志(或标识) 描述
CONSTANT_utf8_info 1 UTF-8编码的字符串
CONSTANT_Integer_info 3 整型字面量
CONSTANT_Float_info 4 浮点型字面量
CONSTANT_Long_info 5 长整型字面量
CONSTANT_Double_info 6 双精度浮点型字面量
CONSTANT_Class_info 7 类或接口的符号引用
CONSTANT_String_info 8 字符串类型字面量
CONSTANT_Fieldref_info 9 字段的符号引用
CONSTANT_Methodref_info 10 类中方法的符号引用
CONSTANT_InterfaceMethodref_info 11 接口中方法的符号引用
CONSTANT_NameAndType_info 12 字段或方法的符号引用
CONSTANT_MethodHandle_info 15 表示方法句柄
CONSTANT_MethodType_info 16 标志方法类型
CONSTANT_InvokeDynamic_info 18 表示一个动态方法调用点

常量类型和结构细节

1598773300484.png
1598773308492.png

访问标志

标志名称 标志值 含义
ACC_PUBLIC 0x0001 标志为public类型
ACC_FINAL 0x0010 标志被声明为final,只有类可以设置
ACC_SUPER 0x0020 标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志默认为真。(使用增强的方法调用父类方法)
ACC_INTERFACE 0x0200 标志这是一个接口
ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假
ACC_SYNTHETIC 0x1000 标志此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)
ACC_ANNOTATION 0x2000 标志这是一个注解
ACC_ENUM 0x4000 标志这是一个枚举

字段表访问标志

标志名称 标志值 含义
ACC_PUBLIC 0x0001 字段是否为public
ACC_PRIVATE 0x0002 字段是否为private
ACC_PROTECTED 0x0004 字段是否为protected
ACC_STATIC 0x0008 字段是否为static
ACC_FINAL 0x0010 字段是否为final
ACC_VOLATILE 0x0040 字段是否为volatile
ACC_TRANSTENT 0x0080 字段是否为transient
ACC_SYNCHETIC 0x1000 字段是否为由编译器自动产生
ACC_ENUM 0x4000 字段是否为enum

类索引、父类索引、接口索引

长度 含义
u2 this_class
u2 super_class
u2 interfaces_count
u2 interfaces[interfaces_count]

属性的通用格式

类型 名称 数量 含义
u2 attribute_name_index 1 属性名索引
u4 attribute_length 1 属性长度
u1 info attribute_length 属性表

数据类型和默认初始值对应

类型 默认初始值
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0
char \u0000
boolean false
reference null

标签:info,文件,CONSTANT,字节,数据类型,u2,class,ACC
From: https://www.cnblogs.com/wandaren/p/16905909.html

相关文章

  • 【Java】 Springboot+Vue 大文件断点续传
     同事在重构老系统的项目时用到了这种大文件上传 第一篇文章是简书的这个:https://www.jianshu.com/p/b59d7dee15a6 是夏大佬写的vue-uploader组件:https://www......
  • C++学习------cinttypes头文件的源码学习02---函数定义
    函数定义257__BEGIN_DECLS258intmax_timaxabs(intmax_t__i)__attribute_const____INTRODUCED_IN(19);259imaxdiv_timaxdiv(intmax_t__numerator,intmax_t__de......
  • settings配置文件和源码
    BASE_DIR:用来在项目中构建路径SECRET_KEY:项目生成时候用的秘钥DEBUG:调试模式,在写代码的时候打开,投入使用了就不用了ALLOWED_HOSTS=['']:运行那些ip来进行访问......
  • Java IO 中常用的目录和文件操作,用到的时候从这里拷贝就行了
    文件是操作系统对磁盘上数据的组织形式。文件包括文件路径和文件名,比如:/Users/Calvin/Desktop/demo.txt复制代码文件名的后缀其实是文件名的一部分,文件不一定要有后缀,但是一......
  • redis配置文件详解
    redis配置文件详解1、开头说明这里没什么好说的,需要注意的是后面需要使用内存大小时,可以指定单位,通常是以k,gb,m的形式出现,并且单位不区分大小写。2、INCLUDE......
  • 使用Regex正则表达式替换.txt文本文件中指定的词
     1///<summary>2///替换文本文件中的词3///</summary>4///<paramname="filePath"></param>5///<paramn......
  • 传奇服务端各文件名字功能
    传奇服务端各文件名字功能一、传奇常见的引擎:GOM单职业or三职业GEE单职业or三职业or合击LEG合击or三职业or复古HERO合击or三职业or复古BLUE合击or三职......
  • php将html生成为pdf文件的几个代码包比较
    最近需要开发一个生成pdf文件的程序,试用了下几个生成pdf包的效果<divstyle="width:80%;padding-right:3rem;padding-left:3rem;margin-right:3rem;margin-left:3rem;......
  • php处理csv文件
    php读取上传的csv文件$filePath=$_FILES['file']['tmp_name'];$data=[];if(file_exists($filePath)){$handle=fopen($filePath,'r');while($tmp=......
  • C#中XmlTextWriter读写xml文件详细介绍
    XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWri......