龙空技术网

JVM的基础,class文件的理解(2)

蚊子码农 44

前言:

如今大家对“class反编译器”大体比较注重,姐妹们都想要学习一些“class反编译器”的相关文章。那么小编也在网络上收集了一些有关“class反编译器””的相关知识,希望大家能喜欢,我们一起来学习一下吧!

本文是“深入学习JVM”系列的第二篇文章,主要介绍class文件的数据结构。

我是蚊子码农,欢迎各位的点赞、关注和收藏,有了你们的激励,我会带来更好的作品。

一、前言

class文件,通常由Java编译器编译得到,用于JVM的工作。

我们按功能研究其数据结构。

不过,我们首先要知道,class文件用无符号整型表示所有数据。

为了方便组织,用多个无符号整型,组成一张表。

整个class文件,本质上就是一张表。

二、概括

按照功能,class文件可以被分为9个数据区,分别是

魔数 – 验证class文件的正确性;版本号 – 标识生成class文件的编译器版本;常量池 – 最重要的地方,大多数数据的存储位置;访问标识 – 描述这个资源是类还是接口,访问的权限是public、private等,类索引 – 描述这个类的全限定名;父类索引、接口索引集合 – 描述这个类的父子结构字段表 – 描述这个类定义的成员变量和变量属性;方法表 – 描述这个类定义的方法和方法属性;属性表 – 描述class文件的附带信息;三、按功能详解class文件第一,魔数功能:用于验证class文件正确性第二,版本号功能:说明编译class文件的编译器的版本。原因:高级编译器生成的class文件,无法由低级JVM执行。【即:保证运行成功】第三,常量池功能:存放大量常量资源。组成:常量池计数器:记录常量池中有多少个常量【从1开始,1表示没有常量】常量池数组:真实的常量值。第四,访问标识功能:描述当前类(或接口)的访问修饰符【比如public、private、识别当前文件是类还是接口等等】第五,类索引功能:确定该类的全限定名第六,父类索引和接口索引集合功能:确定这个类的父类的全限定名,和所有实现接口的全限定名备注:由于Java是单继承,多实现,所以允许实现多个接口,因此,采用数组的结构,存储接口索引;接口索引集合的组成:接口计数器:记录显式接口索引的个数【显式接口:也就是在Java源文件中,我们实现的接口,比如我们implements接口A,A可能有个父接口B,B就不属于显式接口】接口索引表数组:存放接口信息第七,字段表集合功能:描述接口或类中声明的变量【包括所有显式变量】备注:不会列出从父类、实现的接口中继承的字段【但是由于Java有内部类的机制,所以为了保持访问性,可能会有不存在的字段】字段表集合的组成:字段计数器:记录字段的个数;字段表数组:存放字段信息第八,方法表集合功能:描述接口或类中声明的方法;备注:不会列出父类父接口的方法,除非本类重写了它们的方法。组成:方法计数器:记录方法的个数;方法表:存放方法信息第九,属性表功能:描述class文件所携带的辅助信息,在JVM运行时,会使用这些信息进行某些活动四、结语

我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

标签: #class反编译器