JVM_字节码文件(ClassFile)详解

JVM_字节码文件(ClassFile)详解,第1张

我们知道 javac 命令可以将 .java 文件编译成 .class 文件,而这个 Class 文件 中包含了 Java虚拟机 指令集、符号表以及若干其他辅助信息;最终将在 Java虚拟机 运行。

本文是以 JVM8 为例的。

每一个 Class文件 都有如下的 ClassFile 文件结构:

先简单介绍一下 ClassFile 文件结构各部分含义:

描述符是表示字段方法类型的字符串。

字段描述符表示类、实例或局部变量的类型。

从上面文法可以看出,字段描述符中一共有三个类型:

方法描述符包含 0 个或者多个参数描述符以及一个返回值描述符。

看了描述符,可能大家有点疑惑,泛型信息怎么表示啊?

常量池的通用格式如下:

目前 JVM8 中一共用 14 种常量类型,分别如下:

我们知道要使用一个字段或者调用一个方法,就必须知道字段或者方法所属类符号引用,和字段的名字和类型,方法的名字和方法参数类型以及方法返回值类型。

但是我们知道类是能继承的,那么子类调用父类的方法或者字段,这里的所属类符号引用,到底是子类本身还是父类的呢?

我们知道类,方法,字段都有不同的访问标志,在 Class 文件 中使用一个 u2 类型数据项来存储,也就是最多可以有 16 个不同标志位。

在类,方法,字段中有相同的标志,也有不同的标志,总体规划,我们可以借助 Modifier 类的源码来了解:

在 Modifier 类中,类的访问标志:

我们知道在 java 中类可以用的修饰符有: public , protected , private , abstract , static , final , strictfp 。

但是我们再看 Class 文件 中类的访问标志:

仔细看,你会发现有些不同点:

在 Modifier 类中,字段的访问标志:

我们知道在 java 中字段可以用的修饰符有: public , protected , private , static , final , transient 和 volatile 。

但是我们再看 Class 文件 中字段的访问标志:

Class 文件 中字段的访问标志和 java 中字段的修饰符差不多,只是多了 ACC_SYNTHETIC 和 ACC_ENUM 两个标志。

在 Modifier 类中,方法的访问标志:

我们知道在 java 中方法可以用的修饰符有:

public , protected , private , abstract , static , final , synchronized , synchronized 和 strictfp 。

但是我们再看 Class 文件 中方法的访问标志:

字段详情 field_info 的格式如下:

方法详情 method_info 的格式如下:

关于 Class 文件 中属性相关信息,我们再后面章节介绍。

我们可以通过 javap 的命令来阅读 Class 文件 中相关信息。

这个是最简单的一个类,没有任何字段和方法,只继承 Object 类,我们来看看它编译后的字节码信息,通过 javap -p -v T.class 的命令:

我们重点关注常量池相关信息,会发现虽然 T.class 很干净,但是也有 15 个常量,来我们依次分析:

与之前的例子相比较,多了一个字段和方法,那么得到的字节码信息如下:

但是你会发现常量池中怎么没有这个字段 name 的 CONSTANT_Fieldref_info 类型的常量呢?

那是因为我们没有使用这个字段。

多写了一个方法 test1 来调用 name 字段和 test 方法,那么得到的字节码信息如下:

这里定义一个父类 TParent ,有一个公共字段 name 和方法 say 。子类

class 是java的关键字, 在声明java类时使用

Class 是java JDK提供的一个类,完整路径为 java.lang.Class

区别是指两个或两个以上的事物间的不同,当两种相似的事物作比较时,它们的不同点便是区别。

那么 class和Class的相似性就只有一个,那都是单词"class",就是一个为首字母大写,一个为小写.

class和Class的作用:

1. class只用于类声明

2. Class则用于抽象类的相关信息. java是面向对象的, 一般是把一些事物抽象成一个类,比如将学生信息抽象成Student这个类Student类会抽象学生的姓名/性别/生日等信息

那么java中也就把java中的类也抽象成了一个类叫ClassClass中抽象了类的包名/类名/属性数组/方法数组等


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11725738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存