深入理解Java虚拟机读书笔记之:第6章 Java class文件
来源:互联网 发布:淘宝网中老年女上装 编辑:程序博客网 时间:2024/06/06 03:52
class文件“基本类型”
类 型
描 述
u1
1个字节,无符号类型
u2
2个字节,无符号类型
u4
4个字节,无符号类型
u8
8个字节,无符号类型
ClassFile表的格式
类 型
名 称
数 量
u4
magic
1
u2
minor_version
1
u2
major_version
1
u2
constant_pool_count
1
cp_info
constant_pool
constant_pool_count-1
u2
access_flags
1
u2
this_class
1
u2
super_class
1
u2
interfaces_count
1
u2
interfaces
interfaces_count
u2
fields_count
1
field_info
fields
fields_count
u2
methods_count
1
method_info
methods
methods_count
u2
attributes_count
1
attribute_info
attributes
attributes_count
常量池标志
入 口 类 型
标 志 值
描 述
CONSTANT_Utf8
1
UTF-8编码的Unicode字符串
CONSTANT_Integer
3
int类型字面值
CONSTANT_Float
4
float类型字面值
CONSTANT_Long
5
long类型字面值
CONSTANT_Double
6
double类型字面值
CONSTANT_Class
7
对一个类或接口的符号引用
CONSTANT_String
8
String类型字面值
CONSTANT_Fieldref
9
对一个字段的符号引用
CONSTANT_Methodref
10
对一个类中声明的方法的符号引用
CONSTANT_InterfaceMethodref
11
对一个接口中声明的方法的符号引用
CONSTANT_NameAndType
12
对一个字段或方法的部分符号引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
access_flags项的标志位
标 志 名
值
设置后的含义
设 置 者
ACC_PUBLIC
0x0001
public类型
类和接口
ACC_FINAL
0x0010
类为final类型
只有类
ACC_SUPER
0x0020
使用新型的invokespecial语义
类和接口
ACC_INTERFACE
0x0200
接口类型,不是类类型
所有的接口,没有类
ACC_ABSTRACT
0x0400
abstract类型
所有的接口,部分类
基本类型终结符
终 结 符
类 型
B
byte
C
char
D
double
F
float
I
int
J
long
S
short
Z
boolean
字段描述符示例
描 述 符
字 段 声 明
I
int i;
[[J
long[][] windingRoad;
[Ljava/lang/Object;
java.lang.Object[] stuff;
Ljava/util/Hashtable;
java.util.Hashtable ht;
[[[Z
boolean[][][] isReady;
方法描述符示例
描 述 符
方 法 声 明
()I
int getSize();
()Ljava/lang/String;
String toString();
([Ljava/lang/String;)V
void main(String[] args);
()V
void wait();
(JI)V
void wait(long timeout, int nanos);
(ZILjava/lang/String;II)Z
boolean regionMatches(boolean ignoreCase, int toOffset, String other, int offset, int len);
([BII)I
int read(byte[] b, int off, int len);
cp_info表的通常形式
类 型
名 称
数 量
描 述
u1
tag
1
表的类型和格式
u1
info
根据tag值决定
- 文字字符串,如String对象。
- 被定义的类和接口的全限定名。
- 被定义的类的超类(如果有的话)的全限定名。
- 被定义的类和接口的父接口的全限定名。
- 由类或者接口声明的任意字段的简单名称和描述符。
- 由类或者接口声明的任意方法的简单名称和描述符。
- 任何引用的类和接口的全限定名。
- 任何引用的字段的简单名称和描述符。
- 任何引用的方法的简单名称和描述符。
- 与属性相关的字符串。
CONSTANT_Utf8_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Utf8(1)
u2
length
1
bytes项的长度(字节数)
u1
bytes
length
按照变体UTF-8格式存储的字符串中的字符
CONSTANT_Integer_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Integer(3)
u4
bytes
1
按照高位在前的格式存储int类型值
CONSTANT_Float_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Float(4)
u4
bytes
1
按照高位在前的格式存储float类型值
CONSTANT_Long_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Long(5)
u8
bytes
1
按照高位在前的格式存储long类型值
CONSTANT_Double_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Double(6)
u8
bytes
1
按照高位在前的格式存储double类型值
CONSTANT_Class_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Class(7)
u2
name_index
1
包含类或者接口全限定名的CONSTANT_Utf8_info表的索引
CONSTANT_String_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_String(8)
u2
string_index
1
包含文字字符串值的CONSTANT_Utf8_info表的索引
CONSTANT_Fieldref_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Fieldref(9)
u2
class_index
1
声明被引用字段的类或者接口的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了字段的简单名称以及描述符
CONSTANT_Methodref_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_Methodref(10)
u2
class_index
1
声明被引用方法的类的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了方法的简单名称以及描述符
CONSTANT_InterfaceMethodref_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_InterfaceMethodref(11)
u2
class_index
1
声明被引用方法的接口的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了方法的简单名称以及描述符
CONSTANT_NameAndType_info表的格式
类 型
名 称
数 量
描 述
u1
tag
1
值为CONSTANT_NameAndType(12)
u2
name_index
1
给出了CONSTANT_Utf8_info入口的索引,该入口给出了字段或者方法的名称
u2
descriptor_index
1
提供了CONSTANT_Utf8_info入口的索引,该入口提供了字段或者方法的描述符
field_info表的格式
类 型
名 称
数 量
描 述
u2
access_flags
1
见下方的表
u2
name_index
1
提供了给出字段简单名称(不是全限定名)的CONSTANT_Utf8_info入口的索引
u2
descriptor_index
1
提供了给出字段描述符的CONSTANT_Utf8_info入口的索引
u2
atrributes_count
1
attributes_count指出列表中attribute_info表的数量
attribute_info
atrributes
atrributes_count
由多个attribute_info表组成的列表
field_info表中access_flags项的标志
标 志 名 称
值
设 定 含 义
设 定 者
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_TRANSIENT
0x0080
字段设为transient
只有类
method_info表的格式
类 型
名 称
数 量
描 述
u2
access_flags
1
见下方的表
u2
name_index
1
提供了给出方法简单名称(不是全限定名)的CONSTANT_Utf8_info入口的索引
u2
descriptor_index
1
提供了给出方法描述符的CONSTANT_Utf8_info入口的索引
u2
atrributes_count
1
attributes_count指出列表中attribute_info表的数量
attribute_info
atrributes
atrributes_count
由多个attribute_info表组成的列表
method_info表中access_flags项的标志
标 志 名 称
值
设 定 含 义
设 定 者
ACC_PUBLIC
0x0001
方法设为public
类和所有的接口方法
ACC_PRIVATE
0x0002
方法设为private
只有类
ACC_PROTECTED
0x0004
方法设为protected
只有类
ACC_STATIC
0x0008
方法设为static
只有类
ACC_FINAL
0x0010
方法设为final
只有类
ACC_SYNCHRONIZED
0x0020
方法设为synchronized
只有类
ACC_NATIVE
0x0100
方法设为native
只有类
ACC_ABSTRACT
0x0400
方法设为abstract
类和所有的接口方法
ACC_STRICT
0x0800
方法设为strictFP
类和接口的<clinit>方法
由规范定义的attribute_info表的类型
名 称
使 用 者
描 述
Code
method_info
方法的字节码和其他数据
ConstantValue
field_info
final变量的值
Deprecated
field_info、method_info
字段或者方法被禁用的指示符
Exceptions
method_info
方法可能抛出的可被检测的异常
InnerClasses
ClassFile
内部、外部类的列表
LineNumberTable
Code_attribute
方法的行号与字节码的映射
LocalVariableTable
Code_attribute
方法的局部变量的描述
SourceFile
ClassFile
源文件名
Synthetic
field_info、method_info
编译器产生的字段或者方法的指示符
attribute_info表的格式
类 型
名 称
数 量
描 述
u2
attribute_name_index
1
给出了包含属性名称的CONSTANT_Utf8入口的常量池中的索引
u4
attribute_length
1
给出了属性数据的长度(以字节计)
u1
info
attribute_length
包含属性数据
- 一个class文件中只能包含一个类或者接口
- 尽管class文件与Java语言结构相关,但它并不一定必须与Java语言相关
- Java class文件是8位字节的二进制流
- 数据项按顺序存储
- 文件紧凑
- 多字节的项按照高位在前的格式存储
- 常量池至关重要,包含了与class文件中类和接口相关的常量
- 深入理解Java虚拟机读书笔记之:第6章 Java class文件
- 深入理解Java虚拟机之Class类文件的结构
- 《深入理解Java虚拟机》第6章 类文件结构
- 读书笔记之--深入理解Java虚拟机
- 读书笔记之深入理解Java虚拟机
- 《深入理解Java虚拟机》第三章读书笔记:类文件结构
- 深入理解java虚拟机读书笔记之-----Java虚拟机
- 《深入理解Java虚拟机》读书笔记6
- 《深入理解Java虚拟机》读书笔记-第二章
- 《深入理解Java虚拟机》读书笔记
- 深入理解java虚拟机读书笔记
- 深入理解JAVA虚拟机--读书笔记
- 《深入理解Java虚拟机》读书笔记
- 深入理解Java虚拟机读书笔记
- [读书笔记]深入理解java虚拟机
- 深入理解Java虚拟机 - 读书笔记
- 深入理解JAVA虚拟机读书笔记
- [读书笔记]《深入理解java虚拟机》
- Android项目之——Activity悬浮并可拖动(访悬浮歌词)
- SJ9006: 在 IE6 IE7 IE8(Q) 中不能在 JSON 字符串或对象直接量的最后一个键值对后加 ','
- jdk环境变量的配置
- 图片上下滚动特效
- 算法导论 1.2-2
- 深入理解Java虚拟机读书笔记之:第6章 Java class文件
- BlackBerry 10使用Google TTS做中文文本朗读,开发语言C++ Qt Cascade
- 《C和指针》读书笔记(1)
- 基于MAXSCRIPT的模型导出插件技术
- 编辑距离 poj_3356
- 波分复用
- Quartz学习(七)--Spring整合Quartz(JobDetailBean方式)
- ACM菜鸟大牛和教主的区别 (by Roba)
- 归并排序