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对象。
- 被定义的类和接口的全限定名。
- 被定义的类的超类(如果有的话)的全限定名。
- 被定义的类和接口的父接口的全限定名。
- 由类或者接口声明的任意字段的简单名称和描述符。
- 由类或者接口声明的任意方法的简单名称和描述符。
- 任何引用的类和接口的全限定名。
- 任何引用的字段的简单名称和描述符。
- 任何引用的方法的简单名称和描述符。
- 与属性相关的字符串。
名 称 |
数 量 |
描 述 |
|
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表的索引 |
类 型 |
名 称 |
数 量 |
描 述 |
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 |
只有类 |
|
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 Class文件 - **Java Class文件的结构**:本章详细介绍了Java Class文件的各个组成部分,包括魔数、版本号、常量池等。 - **魔数**:用于标识该文件是否为有效的Class文件。 - **版本号**:记录...
- 字节码文件由Java虚拟机(JVM)解释执行,并最终转化为机器指令。 - JVM能够确保Java程序在各种平台上运行,实现了跨平台性。 #### 三、JRE与JDK 1. **JRE (Java Runtime Environment)**: - JRE包含了Java...
3. **运行程序**:通过Java虚拟机(`java.exe`)执行编译后的`.class`文件。 #### 注释 - **单行注释**:使用`//`标记。 - **多行注释**:使用`/* */`包裹注释内容。 #### Java编程方向 - **Java SE (J2SE)**:...
- **JRE(Java Runtime Environment)**:包含了运行Java程序所需的Java虚拟机、核心类库和支持文件。 - **JDK(Java Development Kit)**:包含了JRE,同时还包含了编译工具、调试工具和其他开发工具。 4. **...
2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...
- **垃圾回收**: 由Java虚拟机(JVM)中的一个后台线程GC负责。 - 当虚拟机检测到内存不足时,会触发垃圾回收过程。 - 用户可以通过调用`java.lang.System.gc()`来建议进行垃圾回收,但系统可能会忽略这个请求,根据...
JAVA学习笔记涵盖了从开发环境配置到基础概念的深入讲解,主要知识点包括: 1. **JAVA开发环境**:Eclipse是一款广泛使用的JAVA集成开发环境(IDE),对于初学者来说,需要下载并配置它来编写和运行JAVA程序。配置...
### 第六章:常用类API - **字符串处理**:`String`类和`StringBuilder`类。 - **日期时间操作**:`Date`类、`Calendar`类以及`java.time`包中的类。 ### 第七章:集合框架(容器) - **集合接口**:`Collection`、...
### Java基础知识笔记详细版-菜鸟翻阅必备 #### 一、Java概述 1. **Java语言发展史**: - Java由Sun Microsystems公司于1995年推出。 - 最初由James Gosling领导的设计团队开发,目标是用于家用电器的编程。 - ...
- `classpath` 环境变量指定了Java虚拟机查找类路径的位置。 5. **J2SE安装路径** - 如果J2SE安装在`C:\J2SE`目录下,那么: - `Java.exe` 的绝对路径为 `C:\J2SE\bin\Java.exe`。 - 系统类库的绝对路径为 `C:...
#### 第六章:常见类的使用 **一、Object类** Object类是所有Java类的基类,包含一些基本方法如`equals()`、`toString()`、`hashCode()`等。 **二、String类** String类表示字符串,它是不可变的。提供了多种...
本文档为 Java 初学者笔记,涵盖了 Java 语言的基础知识点、发展史、运行机制、变量与数据类型、运算符、常用工具类、流程控制语句、方法等内容。 一、Java SE 基础语法 * Java 语言的基础语法介绍 * 环境搭建:...
- **JVM(Java Virtual Machine)**:Java虚拟机,负责解释执行字节码。 #### 三、环境变量配置 配置关键环境变量以支持Java开发: - **JAVA_HOME**:指向JDK安装目录。 - **PATH**:包含JDK的bin目录,确保系统能...
【第二章:标识符、关键字和类型】 1. **标识符**:是编程中用于命名的字符序列,如变量名、方法名、类名。它们遵循一定的规则,不能与Java的关键字冲突。 2. **关键字**:是Java预定义的具有特殊含义的标识符,如...
Java学习第二天笔记 本笔记主要讲解Java的概述、环境搭建、语言特点、执行机制、设计理念、开发工具包、运行环境、虚拟机等知识点。 一、Java概述 Java是一种面向对象的程序设计语言,由Sun Microsystems于1995年...
- **Java虚拟机**:`java.exe`解释执行器将字节码加载至JVM中运行。 #### 十四、简单的加法运算程序 ```java public class SimpleAddition { public static void main(String[] args) { int a = 5; int b = 10;...
对于Java虚拟机(JVM)来说,可执行文件的扩展名是`.class`,所以第4题答案是B、*.class。在Java下载页面中,JRE(Java Runtime Environment)的下载选项有不同的类型,如Web JRE、Private JRE、Server JRE等,但...
Java不仅仅是一种编程语言,还包括大量相关技术,如JVM(Java虚拟机)、API(应用程序接口)等。Java可以开发桌面应用和互联网应用。 2. **开发Java程序的步骤**: - 编写源文件:使用.java为后缀的文本文件编写源...