JVM2_字节码与类加载 | Eloise's Paradise
0%

JVM2_字节码与类加载

JVM is

1
2
3
4
5
6
7
8
9
10
11
12
13
package chapter02.atguigu.java;

/**
* @author Joshua.H.Brooks
* @create 2020 下午 6:01
*/
public class ClassInitTest {
private static int num = 1;

public static void main(String[] args) {
System.out.println(ClassInitTest.num);
}
}

编译上面代码的字节码文件:

Screenshot 2022-05-18 at 18.29.06

Magic Number

Minor Version

Major Version

constant_pool_count

constant_pool
长度为constant_pool_count-1的表
1 CONSTANT_Uft8_info
tag:1 – 占用空间一个字节
length:UTF-8字符串占用的字节数
bytes: 长度位length的字符串
3 CONSTANT_Integer_info
tag:3
bytes:4个字节,Big-Endian(高位在前)存储的int值
4 CONSTANT_Float_info
tag:4
4个字节Big-Endian的float值
5 CONSTANT_Long_info
tag:5
8个字节Big-Endian的long值
6 CONSTANT_Double_info
tag:6
8个字节Big-Endian的double值
7 CONSTANT_Class_info
tag:7
index:2字节 指向类的全限定名项的索引
8 CONSTANT_String_info
tag:8
2字节,指向字符串字面量的索引
9 CONSTANT_Fieldref_info
tag:9
index:2字节 指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
index: 2字节 指向字段描述符CONSTANT_NameAndType的索引项
10 CONSTANT_Methodref_info
tag:10
index:2字节 指向声明方法的类或者接口描述符CONSTANT_Class_info的索引项
index: 2字节 指向字段描述符CONSTANT_NameAndType的索引项
11 CONSTANT_InterfaceMethodref_info
tag:11
index:2字节 指向声明方法的类或者接口描述符CONSTANT_Class_info的索引项
index: 2字节 指向字段描述符CONSTANT_NameAndType的索引项
12 CONSTANT_NameAndType_info
tag: 12
index:2字节 指向该字段或方法名称常量项的索引
index: 2字节 指向该字段或方法描述符常量项的索引
15 CONSTANT_MethodHandle_info
tag: 15
reference_kind: 1字节 1-9之间的一个值,决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为。
reference_index:2字节 对常量池的有效索引
16 CONSTANT_MethodType_info
tag:16
descriptor_index:2字节 指向Utf8_info结构表示的方法描述符
18 CONSTANT_InvokeDynamic_info
tag:18
bootstrap_method_attr_index:2字节 当前Class文件中引导方法表的bootstrap_methods[]数组的有效索引
name_and_type_index:2字节 指向NameAndType_info表示的方法名和方法描述符

access_flags
ACC_PUBLIC 0x0001 是否为public类型
ACC_FINAL 0x0010 是否为final
ACC_SUPER 0x0020 该标志必须为真,JDK1.0.2之后编译出来的内容必须为真,指明invokespectial指令使用新语义
ACC_INTERFACE 0x0200 是否接口
ACC_ABSTRACT 0x0400 接口或抽象类
ACC_SYNTHETIC 0x1000 编译器自动生成,非用户代码产生,https://www.jianshu.com/p/d571300810b3
ACC_ANNOTATION 0x2000
ACC_ENUM 0x4000

this_class

super_class

interfaces_count

interfaces

fields_count

fields
access_flags 2字节
ACC_PUBLIC - 0x0001
ACC_PRIVATE - 0x0002
ACC_PROTECTED - 0x0004
ACC_STATIC - 0x0008
ACC_FINAL - 0x0010
ACC_VOLATILE - 0x0040
ACC_TRANSIENT - 0x0080
ACC_SYNTHETIC - 0x1000
ACC_ENUM - 0x4000
name_index u2
descriptor_index u2
B - byte
C - char
D - double
F - float
I - int
J - long
S - short
Z - boolean
V - void
L - Object 例如Lcom/mashibing/jvm/Test
数组[
一维数组[B [Ljava/lang/String
多维数组[[C [[[Ljava/lang/String
attributes_count
attributes

methods_count

methods
access_flags 2字节
ACC_PUBLIC - 0x0001
ACC_PRIVATE - 0x0002
ACC_PROTECTED - 0x0004
ACC_STATIC - 0x0008
ACC_FINAL - 0x0010
ACC_SYNCHRONIZED - 0x0020
ACC_BRIDGE - 0x0040 编译器产生的桥接方法
https://blog.csdn.net/mhmyqn/article/details/47342577
ACC_VARARGS - 0x0080
ACC_NATIVE - 0x0100
ACC_ABSTRACT- 0x0400
ACC_STRICTFP - 0x0800 https://zhidao.baidu.com/question/451207689.html
ACC_SYNTHETIC - 0x1000
name_index u2
descriptor_index u2
先参数列表(放在小括号内部),后返回值
void m() -> ()V
String toString() -> ()Ljava/lang/String;
long pos(int[] arr1, int arr2, long length) -> ([IIJ)J
attributes_count
attributes

attributes_count - u2

attributes
既有预定义属性,也可以自定义,java虚拟机自动忽略不认识的属性
Code - 方法表 - 该方法编译成的字节码指令
u2 attribute_name_index
u4 attribute_length
u2 max_stack
u2 max_locals
u4 code_length
code
u2 exception_table_length
exception_table
u2 attribute_count
attributes
ConstantValue - 字段表 - final关键字定义的常量值
Deprecated - 类、方发表、字段表
Exceptions - 方法表
EnclosingMethod - 类文件 - 局部类或匿名类的外部封装方法
InnerClasses - 类文件 - 内部类列表
LineNumberTable - Code属性 - java源码的行号与字节码指令的对应关系
LocalVariableTable - Code属性 - 方法局部变量表
SourceFile - 类文件 - 源文件名称
……

全限定名:com/mashibing/jvm/Test; (注意结尾的分号)
简单名称:Test

Arthas

Commands

sysenv

-------------本文结束感谢您的阅读-------------