`

JVMS-class文件格式-2【转载】

阅读更多
http://www.i170.com/Forum/113657
花了10多个小时,才将JVMS- class File Format-走一遍  ,虽然针对的是最简单的AAA。意义何在?

1、对class文件格式有了整体认识,看CHAPTER 4 The class File Format已经是简单的事情了;

2、使用字节码察看工具,知道了其各项的对应关系。

3、补了一课,解开了一个心结。

 

CHAPTER 4 The class File Format

pseudostructures:在class文件中是不存在的,一种方便的说明方式。它有多个items,Successive items are stored in the class file sequentially, without padding or alignment. 所以,有一些说明本结构长度的项,如constant_pool_count等等各种xxx_count。

Tables是varying-sized structures ,而an array有fixed-sized items 。

4.1 The ClassFile Structure

    ClassFile {
     u4 magic;
     u2 minor_version;
     u2 major_version;
     u2 constant_pool_count;
     cp_info constant_pool[constant_pool_count-1];
     u2 access_flags;
     u2 this_class;
     u2 super_class;
     u2 interfaces_count;
     u2 interfaces[interfaces_count];
     u2 fields_count;
     field_info fields[fields_count];
     u2 methods_count;
     method_info methods[methods_count];
     u2 attributes_count;
     attribute_info attributes[attributes_count];
    }
这个大图分7段,核心在cp_info 、field_info、method_info和多处使用的attribute_info。

本节比较重要的部分:

1、前10字节:JDK1.0.2中编译的class文件版本号为3.45,version0.50。

2、u2 constant_pool_count 最基本的值为16(事实上15项),其中第0项被隐藏。添加一些代码后,可以研究一下cp_info的变动情况。constant_pool table的排列有一定的顺序。这是重点。

3、中间字节:类的access_flags ,各种修饰符求或;this_class、super_class等等信息都要在constant_pool中找。

4、field_info、method_info和attribute_info,添加一些代码后使用jclasslib研究一下。

 

4.2 The Internal Form of Fully Qualified Class and Interface Names

class文件总是采用fully qualified form 的类型名,所以import语句都是语法糖;java.lang.Object转成了/分割。

4.3 Descriptors

A descriptor using UTF-8 strings (§4.4.7)表示the type of a field or method.

4.4 The Constant Pool

 

严格地,class文件中只有constant_pool table,而常量池是运行期的一个内存空间。当然JVM 指令不依赖类/接口/类实例/数组在运行时的布局,仅仅依赖于本constant_pool table中的字符信息(symbolic information )。

各种constant_pool table实体/条目(entries)由一个u1即1-byte tag来区别,以便使用相应的结构。

public class Yqj{
    public static int i = 5;
    private final double doo = 5.2;
    String str = "hello";
    public Object foo(){
        int iiiiii = 100;
        return "hello";
    }
}
这个程序较AAA复杂得多,37-1项constant_pool table条目。常量池表的index-tag-解释

1、CONSTANT_Methodref (10)这总是第一个条目。共5u

2、CONSTANT_Double (6).表示它占用2个#以组成一个double常量5.2,共9u

4、CONSTANT_Fieldref (9),由#8和#31描述本成员变量即Yqj,dooD,共5u

5、CONSTANT_String (8).其string_index指向CONSTANT_Utf8_info 结构#32,那是它将被初始化的值。3u

6、CONSTANT_Fieldref (9),由#8和#33描述本成员变量即Yqj,strLjava/lang/String

7、CONSTANT_Fieldref (9),由#8和#34描述本成员变量即Yqj,iI

8、CONSTANT_Class (7).由#35描述类信息Yqj。3u

9、CONSTANT_Class (7).由#36描述类信息java/lang/String。3u

10-29,CONSTANT_Utf8 (1).各种保存Utf8字符串的结构。分别是:

#10(i),#11(I),#12(doo),#13(D),#14(ConstantValue),

#15(str),#16(Ljava/lang/String),#17(<init>),#18(()V),#19(Code),

#20(LineNumberTable),#21(LocalVariableTable),#22(this),#23(Lyqj),

#24(foo),#25(()Ljava/lang/Object),#26(iiiiii),#27(<clinit>),

#28(SourceFile),#29(Yqj.java),

30、CONSTANT_NameAndType (12).由#17,#18说明的信息,<init>和()V

31、CONSTANT_NameAndType (12).由#12,#13说明的信息,<doo>和D

32、CONSTANT_Utf8 (1).hello

33、CONSTANT_NameAndType (12).由#15,#16说明的信息,str和Ljava/lang/String

34、CONSTANT_NameAndType (12).由#10,#11说明的信息,i和I

35、CONSTANT_Utf8 (1).Yqj

36、CONSTANT_Utf8 (1).java/lang/String

除了JVM中预定义的字符串(java/lang/String、<init>、()V、I、SourceFile等等)、表示成员的标识符(LYqj、i、doo、iiiiii、foo),程序中定义的命名常量的值5.2CONSTANT_Double,字符串常量#32的CONSTANT_Utf8 被列入constant_pool table。

 

Note: LocalVariableTable is not a necessary attribute. Some compilers even do not generate a LocalVariableTable in .class files, e.g. the jdk 1.4.2_11.

 

分享到:
评论

相关推荐

    java8看不到源码-jvms-compare:JVM比较-使用基准

    该存储库承载了一些作为具有不同配置文件的 Maven 项目运行的单元测试。 单元测试依赖于库并使用 JMH 作为基准。 各种配置文件旨在在不同的 JVM 上执行相同的基准测试,例如 GraalVM CE、GraalVM EE、OpenJDK 11、...

    WindowsJDK版本管理器jvms.zip

    JDK Version Manager (JVMS) for Windows Windows下JDK多版本管理器,类似 nvm, nvmw, rvm 本软件源于 nvm-windows , 现在是第一版 .  这对JDK不同版本之间切换是非常有用的。例如,如果你想测试一个...

    JVM原理之运行时数据区详解

    关于运行时数据官方解释:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5 4.1 堆 (heap) 堆在虚拟机中是一块共享区域, 存放 对象实例 和数组; 堆在虚拟机启动的时候创建。 可调整堆的...

    Windows的JDK版本管理器(JVMS)-Golang开发

    Windows的JDK版本管理器(JVMS)在Windows计算机上管理JDK的多个安装。 JVMS,立即下载! 在某些情况下,能够在不同版本的JDK之间进行切换非常有用。 对于Windows的前JDK版本管理器(JVMS)在Windows计算机上管理JDK...

    jvms13.pdf

    The Java® Virtual Machine Specification Java SE 13 Edition Tim Lindholm Frank Yellin Gilad Bracha Alex Buckley Daniel Smith

    jvms12.pdf(Java虚拟机规范 JDK12版)

    Java虚拟机规范 JDK12版,Java开发者必须要看的文档。文档为英文版,更有利于理解作者的原意。

    ClassViewer v3是轻量级的Java类文件查看器,仅依赖JDK和JavaFX-Android开发

    ClassViewer网站:ClassViewer主页ClassViewer v3是一个轻量级Java类文件查看器,仅依赖JDK和JavaFX,它只有一个小于250k的jar文件,并且可以在JRE 8上运行。OracleJDK不再是ClassViewer网站:ClassViewer主页Class...

    jls8英文文档 jvms8英文文档

    jls英文文档 jvms英文文档

    jvms12.pdf

    java虚拟机规范,java12版本。可以了解java虚拟机的设计。

    jvms7

    jvm

    jdk-8u331-windows-x64.exe

    它实现了 Java 语言规范 (JLS) 和 Java 虚拟机规范 (JVMS),并提供了 Java 应用程序编程接口 (API) 的标准版 (SE)。它是Oracle监管者社区驱动的OpenJDK的衍生物。[5]它提供了用于处理Java应用程序的软件。所...

    jdk-8u361-windows-x64.exe

    它实现了 Java 语言规范 (JLS) 和 Java 虚拟机规范 (JVMS),并提供了 Java 应用程序编程接口 (API) 的标准版 (SE)。它是Oracle监管者社区驱动的OpenJDK的衍生物。[5]它提供了用于处理Java应用程序的软件。所...

    Java虚拟机规范_SE8版

    Java虚拟机规范_SE8版 链接: https://pan.baidu.com/s/1dOSFmu

    JDK版本切换

    windows环境下的JDK1.7与1.8版本自由切换,非常的方便和使用。

    jna-4.2.2 官方原版下载

    Supported on 1.4 or later JVMs, including JavaME (earlier VMs may work with stubbed NIO support) Customizable marshalling/unmarshalling (argument and return value conversions) Customizable mapping ...

    Java语言规范和JVM规范(7、8、9)

    包含Java SE7、8、9的语言规范和虚拟机规范,Oracle官方文档,可以去官网下载:https://docs.oracle.com/en/java/index.html

    office2pdf:将办公文件(word,ppt)转换为pdf

    COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls to the COM libraries. JACOB runs on x86 and x64 environments supporting 32 bit and 64 bit JVMs ...

    muwire-pkg:MuWire包装项目

    GitHub存储库是I2P内部存储库的只读镜像,位于 MuWire包装项目 这是一个用于包装各种平台的MuWire的项目。 您需要签出MuWire( )和I2P(github或单调)作为该项目的兄弟。 为MuWire构建JRE 用ant clean pkg构建I2P...

    jacob-1.19.zip

    COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls to the COM libraries. JACOB runs on x86 and x64 environments supporting 32 bit and 64 bit JVMs

    dcache-endit-provider:dCache近线存储提供程序,用于与Endit集成

    上面的代码将创建一个使用JVMs文件事件通知功能的提供程序,该功能在大多数情况下直接映射到操作系统的本机文件事件通知功能。 轮询提供者 要使用轮询更改的提供程序,请使用: hsm create osm osm the-hsm-name -...

Global site tag (gtag.js) - Google Analytics