其他分享
首页 > 其他分享> > JVM_06 类加载与字节码技术(类文件结构)

JVM_06 类加载与字节码技术(类文件结构)

作者:互联网

类加载与字节码技术

在这里插入图片描述

1、类文件结构

一个简单的 HelloWorld.java 程序:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello world!");
    }
}

接下来执行:javac -parameters -d . HelloWorld.java 命令编译.java文件为.class文件:

在这里插入图片描述

获得二进制字节码文件后怎么读呢?有2种方式:

在这里插入图片描述

在这里插入图片描述

根据 JVM 规范,类文件结构如下

在这里插入图片描述


1.1 魔数(u4 magic)

魔数(u4 magic):对应字节码文件的0~3个字节,表示文件的特定类型,不同文件有自己不同的魔数信息,例如java的二进制.class文件的魔数类型就是如下:

0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 091

对于这个cafebabe的由来就不再说了!


1.2 版本(u2 minor_version、u2 major_version)

版本:对应字节码文件的4~7个字节,表示类的版本 :

0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09

这里的十六进制 34H(00 34) 表示十进制的 52,代表的就是JDK8,依次类推:51 就是 JDK 7,53 就是JDK 9。


1.3 常量池

常量池表:

Constant Type 常量类型Value 常量对应的序号(十进制)
CONSTANT_Class7
CONSTANT_Fieldref9
CONSTANT_Methodref10
CONSTANT_InterfaceMethodref11
CONSTANT_String8
CONSTANT_Integer3
CONSTANT_Float4
CONSTANT_Long5
CONSTANT_Double6
CONSTANT_NameAndType12
CONSTANT_Utf81
CONSTANT_MethodHandle15
CONSTANT_MethodType16
CONSTANT_InvokeDynamic18

案例分析

8~9 字节,表示常量池长度,00 23 (35) 表示常量池有 #1~#34项,注意#0 项不计入,也没有值
0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09


1.4 访问标识与继承信息

21 表示该 class 是一个类,公共的类:

0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 05

表示根据常量池中 #5 找到本类全限定名:

0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 06

表示根据常量池中 #6 找到父类全限定名:

0000660 29 56 00 21 00 0500 06 00 00 00 00 00 02 00 01

表示接口的数量,本类为:

0 0000660 29 56 00 21 00 05 00 0600 00 00 00 00 02 00 01

Flag NameValueInterpretation
ACC_PUBLIC0x0001Declared public ; may be accessed from outside its package.(公共)
ACC_FINAL0x0010Declared final ; no subclasses allowed.(Final)
ACC_SUPER0x0020Treat superclass methods specially when invoked by the invokespecial instruction.(类)
ACC_INTERFACE0x0200Is an interface, not a class.(接口)
ACC_ABSTRACT0x0400Declared abstract ; must not be instantiated.(抽象)
ACC_SYNTHETIC0x1000Declared synthetic; not present in the source code.(人工合成的代码,非源代码)
ACC_ANNOTATION0x2000Declared as an annotation type. (注解)
ACC_ENUM0x4000Declared as an enum type. (枚举)

1.5 Field 信息

表示成员变量数量,本类为

0 0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01

FieldTypeTypeInterpretation
Bbytesigned byte
CcharUnicode character code point in the Basic Multilingual Plane, encoded with UTF-16
Ddoubledouble-precision floating-point value
Ffloatsingle-precision floating-point value
Iintinteger
Jlonglong integer
L ClassName ;referencean instance of class ClassName
Sshortsigned short
Zbooleantrue or false
[referenceone array dimension

1.6 Method 信息

表示方法数量,本类为 2

0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01

一个方法由 访问修饰符,名称,参数描述,方法属性数量,方法属性组成:

0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01

0000700 00 07 00 08 00 01 00 09 00 00 00 2f 00 01 00 01

0000720 00 00 00 05 2a b7 00 01 b1 00 00 00 02 00 0a 00

0000740 00 00 06 00 01 00 00 00 04 00 0b 00 00 00 0c 00

0000760 01 00 00 00 05 00 0c 00 0d 00 00 00 09 00 0e 00

0000760 01 00 00 00 05 00 0c 00 0d 00 00 00 09 00 0e 00

0001000 0f 00 02 00 09 00 00 00 37 00 02 00 01 00 00 00

0001020 09 b2 00 02 12 03 b6 00 04 b1 00 00 00 02 00 0a

0001040 00 00 00 0a 00 02 00 00 00 06 00 08 00 07 00 0b

0001060 00 00 00 0c 00 01 00 00 00 09 00 10 00 11 00 00

红色代表方法属性(属性2)

0001100 00 12 00 00 00 05 01 00 10 00 00 00 01 00 13 00

0001120 00 00 02 00 14


1.7 附加属性

0001100 00 12 00 00 00 05 01 00 10 00 00 00 01 00 13 00

0001120 00 00 02 00 14

参考文献 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

标签:00,01,06,字节,61,6c,65,JVM,69
来源: https://blog.csdn.net/weixin_43591980/article/details/116308906