一.Class文件结构

1. Class文件是一组以8位字节为基础的二进制流,采用一种类似C语言结构体的伪代码类存储。它只有两种数据类型:无符号数和表。

2. 无符号数属于基本的数据类型,以u1,u2,u4,u8分表代表1个,2个,4个,8个字节。他可以用来描述数字,索引引用,数量值,UTF-8编码的字符串。

3. 表有多个无符号数或其他表作为数据项构成的符合数据类型,所有的表都已_info结尾。

4. Class文件格式

类型

名称

数量

U4

Magic(魔数)

1

U2

Minor_version(次版本号)

1

U2

Major_version(主版本号)

1

U2

Constant_pool_length

1

Cp_info

Constant_pool(常量池)

Constant_pool_length-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

Attribute_count

5. 魔数和class文件的版本

a) 魔数:确定这个文件是否为一个能被虚拟机接受的class文件。

b) 版本号:每个JDK版本对应一个版本号段,低版本的JDK不能执行标识高版本JDK的版本号class文件,但是高版本的可以执行低版本的(向下兼容的特性)。

c) 常量池:(注意常量池使用1计数的,0表示常量池为空)常量池主要存放两类常量:字面量(Literal)和符号引用(Symbolic Reference)。

字面量包括文本字符串,被声明为final的常量等。

符号引用包括:类和接口的全限定名;字段名称和描述符;方法的名称和描述符。

常量池中的每一项都是一个表。

类型

标志

描述

CONSTANT_UTF-8_info

1

UTF-8编码的字符串

CONSTANT_Integer_info

3

整形字面量

CONSTANT_Float_info

4

浮点型字面量

CONSTANT_Long_info

5

长整型字面量

CONSTANT_Double_info

6

双精度浮点型字面量

CONSTANT_Class_info

7

类或接口的符号引用

CONSTANT_String_info

8

字符串类型字面量

CONSTANT_Fieldref_info

9

字段的符号引用

CONSTANT_Methodref_info

10

类中方法的引用

CONSTANT_InterfaceMethodref_info

11

接口中方法的引用

CONSTANT_NameAnd_info

12

字段或方法的部分符号引用

d) 访问标志:用于标识一些类或借口层次的访问信息,包括:这个class是接口还是类,是否定义为public类型等

标志名称

标志值

含义

ACC_PUBLIC

0x0001

是否为public类型

ACC_FINAL

0x0010

是否声明为final,只有类可以设置

ACC_SUPER

0x0020

是否允许使用invokespcial字节码指令

ACCC_INTERFACE

0x0200

标识这是一个接口

ACC_ABSTRACT

0x0400

是否为abstract类型,对于接口和类这个标识为真,其他类为假

ACC_AYNTHETIC

0x1000

标识这个类并非由用户代码产生

ACC_ANNOTATION

0x2000

标识这是一个注解

ACC_ENUM

0x4000

标识这是一个枚举

6. 类索引、父类索引和接口索引集合:类索引,父类索引都是一个u2类型的数据,但是接口索引集合是一组u2类型的集合,class文件由这三项确定继承关系。

7. 字段表集合:用于描述接口或类中声明的变量。字段包括类变量和实例变量,但是不包括方法内的变量。

a) 字段访问标识

标识名称

标志值

ACC_PUBLIC

0x0001

ACC_PRIVATE

0x0002

ACC_PROTECTED

0x0004

ACC_STATIC

0x0008

ACC_FINAL

0x0010

ACC_VOLTATILE

0x0040

ACC_TRANSIENT

0x0080

ACC_SYNTHETIC

0x1000

ACC_ENUM

0x4000

8. 方法表集合:类似字段表集合。

a) 访问标志

标识名称

标志值

ACC_PUBLIC

0x0001

ACC_PRIVATE

0x0002

ACC_PROTECTED

0x0004

ACC_STATIC

0x0008

ACC_FINAL

0x0010

ACC_SYNCHRONIZED

 

ACC_BRIDGE

0x0040

ACC_VARARGS

0x0080

ACC_NATIVE

0x0100

ACC_ABSTRACT

0x0400

ACC_STRICT

0x0800

ACC_SYNTHETIC

0x1000

b)  方法的重载(overload)和重写(override)

重载:除了要与原来的方法具备相同的名称之外,还要具备不同的特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合。(java代码的方法特征签名只包括了方法名称,参数顺序,即参数类型,而字节码的特征签名还包括方法返回值及受检异常表)。

重写: 拥有相同的方法名和特征签名但有不同的方法体。

9. 属性集合:在class文件,字段表,方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

a) 属性表

属性名称

使用位置

含义

Code

方法表

Java代码编译成字节码指令

ConstantValue

字段表

Final关键字定义的常量值

Deprecated

类、方法表、字段表

被声明为deprecated的方法和字段

Exceptions

方法表

方法抛出异常

InnerClass

类文件

内部类列表

LineNumberTable

Code属性

Java源码的行号与字节码指令的对应关系

LocalVariableTable

Code属性

方法的局部变量描述

SourceFile

类文件

源文件名称

Synthetic

类、方法表、字段表

标识方法或字段为编译器自动生成

b) Javac在编译的时候会把对this关键字的访问转变为一个普通方法参数的访问,然后在虚拟机调用实例方法时自动传入此参数即可。

c) Java异常实际上是java代码的一部分不是简单地跳转。

转载于:https://www.cnblogs.com/focusj/archive/2012/03/01/2374604.html

深入理解JVM读书笔记--Class文件结构相关推荐

  1. 深入理解 Jvm 读书笔记(一)

    Jvm 内存管理,GC,类文件架构相关 知识包括: jvm内存管理 jvm运行时数据区划分 jvm层对象的创建过程 对象的内存布局 对象的访问定位 垃圾收集器与内存分配策略 对象已死的判定及引用分类 ...

  2. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  3. 深入理解JVM读书笔记--内存管理

    2019独角兽企业重金招聘Python工程师标准>>> 一. Java的运行时数据区域 (1)程序计数器(线程私有):是一块较小的内存空间,它的作用是当前线程所执行字节码的行号指示器 ...

  4. JVM读书笔记之GC算法

    前面我们说了如何判断对象的生存与死亡,JVM判断了对象的生存与死亡之后需要一定的策略区回收死亡对象.本篇博客对四种常用的GC算法的思想进行一些说明. 标记--清除算法: 最基础的算法,分为标记和清除两 ...

  5. 计算机存储的四个区,JVM读书笔记篇一:如何管理4个G的“封地”

    开篇闲话: 王侯将相皆有封地,大小根据爵位高低而不同,等级森严.在计算机世界里,大boss(操作系统)很公平,给大家(进程)都分配了同样的内存大小(虽然这也是个假象).我们的主角JVM出生的那天,大b ...

  6. 垃圾回收算法简单介绍——JVM读书笔记lt;二gt;

    垃圾回收的过程主要包含两部分:找出已死去的对象.移除已死去的对象. 确定哪些对象存活有两种方式:引用计数算法.可达性分析算法. 方案一:引用计数算法 给对象中加入一个引用计数器.每当有一个地方引用它时 ...

  7. JVM学习笔记——class文件结构

    [b]Java编译过程: [/b][img]http://www.oschina.net/uploads/img/201001/11000149_dJCf.gif[/img] [b]Java的Clas ...

  8. Java JVM 读书笔记 - 虚拟机性能监控和故障处理工具

    给系统定位问题,知识.经验是关键基础,数据时依据,工具是运用知识处理数据的手段. 数据:运行日志    异常堆栈  GC日志  线程快照(threaddump/javacore文件)  堆转储快照(h ...

  9. 深入理解计算机系统读书笔记(第二章 信息的表示和处理)

    这里写自定义目录标题 第二章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制表示法 2.1.2 字数据大小 2.1.3 寻址和字节顺序 2.1.4 表示字符串 2.1.5 代码表示 2.1. ...

最新文章

  1. 天津春考计算机重点知识,天津春考第一学期期中试卷(计算机基础)
  2. 机房USB被禁用的方法
  3. 做流向图_各类型供热暖系统图大全,一饱眼福!
  4. okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全
  5. Java 8:再见手册SQL,您好!
  6. Visual C++开发工具与调试技巧整理
  7. C++中的L和_T()
  8. Visual Basic(VB6.0)精简版
  9. 智能传感器应用领域及其发展现状
  10. IDEA Maven 使用教程
  11. HTML在线转换JS
  12. e^(At)求解方法及其含义–线性微分方程的求解
  13. 万字好文,手把手教你做一个「vue3+express+typescript」的全栈模板项目
  14. Gtalk怎么样绑定MSN帐号,在Gtalk里面聊MSN的方法
  15. android判断系统版本号,Android获取手机型号/系统版本号/App版本号等信息实例讲解...
  16. Unity 屏幕模糊效果
  17. Zookeeper学习思维导图
  18. 什么是CSDN开源社区
  19. kermit使用注意事项
  20. 舆情监测系统平台对网络舆情监测的作用

热门文章

  1. 可微偏导数一定存在_【数学】多元函数可微如何判断?
  2. python 输出文字_Python中输出ASCII大文字、艺术字、字符字小技巧
  3. python中的条件判断稀硫酸_大学mooc2020用Python玩转数据期末考试查题公众号答案...
  4. js 对象数组和对象的使用
  5. Linux学习笔记---使用BusyBox创建根文件系统(三)
  6. mybatis-generator-maven-plugin插件自动生成代码的配置方法
  7. 毕设日志——特征融合修改vgg16.py
  8. Coursera机器学习编程作业Python实现(Andrew Ng)—— 2.1 Logistic Regression
  9. Embedded Android 协同翻译
  10. Android TabHost中Activity之间传递数据