当前位置: 首页 > 网络应用技术

Java文件结构

时间:2023-03-08 19:49:11 网络应用技术

  谈到JVM的不合理性,有两个主要两个:

  Java源代码首先需要使用Javac编译器将其编译到.class文件中,然后通过JVM执行.class文件,以便程序开始运行。

  JVM仅知道.class文件。它不在乎哪种语言生成.class文件。只要.class文件符合JVM规格要运行的规格,就已经有了可以在JVM上运行的Jruby,Jython,Scala和其他语言,它们具有自己的语法规则,但是他们的编译器可以编译各自的源将符合JVM规范的.LASS文件代码,以便它们可以在JVM的帮助下运行它们。

  Java语言中各种变量,关键字和计算符号的语义最终由多个字节命令命令组合。因此,字节代码命令提供的语义描述能力肯定会比Java语言本身更强,因此有一些Java语言无法有效地支持语言特征,这并不意味着不能有效地支持字节代码本身。

  类文件是一个二进制文件。它的内容具有严格的规格。文件中没有空格,所有这些都连续0/1。所有类文件的内容都分为两种类型:non -sign,表。

  该类文件特定于以下内容:

  类文件的前4个字节称为魔术,用于表示此类文件的类型。

  类文件的神奇数字是由十六进制代表的“ Cafe Babe”。这很浪漫吗?

  魔术的数量等同于文件后缀名称,但是复杂名称很容易修改并且不安全。因此,类文件中评分文件的类型更合适。

  魔术号的4个字节是版本信息之后,立即立即代表次要版本编号,而7-8字节代表主版本编号。他们代表当前类文件中使用哪个版本的JDK。

  JDK的高版本可以与类文件的先前版本兼容,但不能运行类文件的后期版本。即使文件格式不更改,虚拟机也必须拒绝执行超过其版本号的类文件。

  版本信息为恒定池之后,将两种类型的常数存储在常数池中:

  常数代表类或界面的符号引用),其两个维表结构如下:

  U1TAG1U2NAME_INDEX1TAG是一个徽标位,可区分常数类型。name_index是一个索引值,指向常数池中的常数_UTF8_INFO类型常数。该常数代表此类的完整名称(或接口)。它指的是常数池中的第二个常数。

  constant_utf8_info类型常数结构如下:

  U1TAG1U2LENGTH1U1BYTESLENGTHTAG是电流常数的类型;长度表示该字符串的长度;字节是该字符串的内容(使用狭窄的UTF8编码)

  在恒定池结束后,使用两个字节代表访问标记。此徽标用于标识某些类或接口级别的访问信息,包括:无论是:该类还是接口;它是否被定义为公共类型;是否是抽象/最终修改。

  类索引和父级索引是U2类型数据,接口索引集合是一组U2类型数据集。类文件由这三个数据确定以确定类的继承关系。引用了类以确定此类的完整限制名称,并引用父类以确定父类的完整名称这个课。

  因为Java不允许多个继承,所以只有一个父索引。除Java.lang.Object外,所有Java类都有父类。因此,对于0.A类可以实现多个接口,因此描述了接口索引集合。该集合的第一项是U2类型数据,指示索引表的容量,下一个是接口的名称索引。

  类索引的两种U2类型的索引值和父类表明,它们每个指向类型的类型的类别的类描述符频率。

  字段表收集了此类别中涉及的成员变量,包括实例变量和类变量,但不包括该方法中的局部变量。

  每个字段表仅表示一个成员变量,并且此类别中的所有成员变量构成一个字段集。字段表结构如下:

  U2ACCESS_FLAGS1字段的访问徽标和具有略有不同U2NAME_INDEX1字段名称的索引U2Descriptor_index1描述符来描述该字段的数据类型。基本数据类型由大写字母表示;对象类型由“ l对象类型的完整限制名称”表示.U2ATTRIBUTES_COUNT1属性表集合u2attributesattributes_count_count属性表用于存储属性的其他信息,例如属性的值。字段集中的类(或接口),但是可能会显示Java代码中可能不存在的字段。对于exippleadd,一个字段到外部类实例。

  方法表结构与属性表相似。

  挥发性关键字和瞬态关键字无法修改,因此方法表访问徽标中没有访问徽标。

  方法表的属性表中有一个代码属性表,用于存储编译设备编译的字节代码指令。

  每个属性对应于属性表,属性表的结构如下:

  u2attribute_name_index1u4attribute_length1u1infoattribute_length参考[深度理解Java虚拟机]