`
ZangXT
  • 浏览: 118015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读书笔记:java的class文件格式分析(一)

阅读更多

    阅读Java Virtual Machine Specification中的第四章,理解Java的class文件格式。

class文件由8位的字节流组成。

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 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[attrributes_count];

}

说明:u2表示无符号2字节量,u4表示无符号4字节量。

各字段的说明:

magic

一般二进制文件中都有magic number这一项,这个数说明该文件是一个class文件,它的值是0xcAFEBABE。

minor_version,major_version

class文件的版本号。

constant_pool_count

常量池表中项目数加1得到。从后面的cp_info constant_pool[constant_pool_count-1];也容易理解这个值的意思。

cp_info constant_pool[]

存储该class文件中使用到的常量信息。

access_flag

说明该class文件的访问权限和相关属性,通过位掩码来设定。

Flag Name 解释
ACC_PUBLIC 0x0001 public
ACC_FINAL 0x0010 final
ACC_SUPER 0x0020 跟调用invokespecial指令时的处理有关
ACC_INTERFACE 0x0200 这是个接口
ACC_ABSTRACT 0x0400 abastract
ACC_SYNTHETIC 0x1000 没有在源代码中出现,该类是编译器生成的
ACC_ANNOTATION 0x2000 注解类型
ACC_ENUM 0x4000 枚举类型

这些属性都很容易理解,比如我们定义一个类public final Test{},则Test.class的access_flag中,ACC_PUBLIC和ACC_FINAL是置位的,而ACC_INTERFACE一项肯定是0。很多类似的组合规则倒是容易自己总结出来,比如如果ACC_INTERFACE置位了,那肯定ACC_ABSTRACT也是置位的,因为接口肯定是抽象的;等等,诸如此类。

画一个具体的位示意图表示:

image

this_class

一个下标,指向常量池表中代表当前类的Constant_Class_info。

super_class

为0,或者为一个下标,指向常量池中代表其父类的Constant_Class_info。如果这个值为0,那么当前类肯定是Object类。如果当前类是一个接口,该下标指向的是Object类的描述信息。

interface_count

该类实现的接口数,或者该接口实现的超接口数。

interfaces[]

具体的接口信息,每一项都是常量池表中的一个下标,指向表示接口的Constant_Class_info。

后面几个依次是字段(field),方法(methods)和属性的描述,不再赘述,

下面具体的分析一个class文件。源文件很简单:

public class Test{
public static void main(String[] args){
System.out.println("Hello World!");
}
}

编译,得到Test.class文件,使用WinHex打开。

image

前4个字节是magic部分,内容为0xCAFEBABE;随后的4个字节是class文件的版本号,这里主版本号是0x0032,也就是50,这是使用jdk1.6编译出的class文件。再后面的2个字节是常量池表的大小信息,0x001D,也就是29,说明常量池表中一共有28项。为了方便观察,可以使用javap -verbose Test得到的结果和当前的二进制文件进行对比。

入门到此,以后继续。

分享到:
评论

相关推荐

    《java程序设计习题集》读书笔记上册

    - 编译包含两个类的Java源文件会生成两个`.class`文件。 #### 第二章:Java语言特性 1. **标识符规则** - Java标识符区分大小写。 - 标识符可以由字母、数字、下划线(_)和美元符号($)组成,但不能以数字...

    java学习笔记

    - **JVM (Java Virtual Machine)**:Java虚拟机,负责执行由JDK编译器生成的字节码(.class文件)。 ##### 在Linux下配置Java环境 - 配置文件路径:`/etc/profile` - 使用`cat /etc/profile`查看配置文件内容。 - **...

    Java经典入门+笔记

    "Java经典入门+笔记"是一份全面的学习资源,包含了基础到进阶的Java知识,结合了书籍《Java经典入门》的内容以及作者去年暑假学习过程中的笔记。这份资料适合初学者和希望巩固Java基础的开发者。 《Java经典入门...

    学习JSP的读书笔记

    3. 编译Servlet源代码为.class文件,并加载到内存中。 4. Servlet执行相应的业务逻辑,并生成HTML响应(Response)。 5. 将响应发送回客户端,浏览器解析渲染后展示给用户。 在开始学习JSP之前,确保搭建好开发环境至...

    JSP读书笔记1pdf格式

    <jsp:useBean id="str" scope="page" class="java.lang.Student"/> ``` - `id`: 指定一个变量名来引用创建的对象。 - `scope`: 指定作用域,可以是`page`、`request`、`session`或`application`。 - `class`: ...

    j2se读书精华笔记

    javac(Java编译命令)能将它编译为二进制代码文件,就是我们所见到的以class作为扩展名的文件。 初学Java,建议使用SUN公司的JDK 如果编译通过,没有发现任何错误,屏幕上不会有任何显示;否则会出现一大堆错误报告 ...

    hibernate 读书笔记

    通过这份读书笔记,读者将能全面理解Hibernate的工作机制,掌握其基本用法,并能够将其应用于实际的Java开发项目中。同时,对于源码部分的探讨,有助于深入理解Hibernate的内部运行原理,提升开发技能。

    Tomcat学习笔记

    ### Tomcat学习笔记知识点解析 #### 一、Tomcat简介 Tomcat是一款开源的轻量级Servlet容器,它能够作为独立的应用服务器运行Java Web应用程序。Tomcat由Apache软件基金会(Apache Software Foundation)维护,是Java...

    2012struts2读书笔记

    这篇读书笔记主要涵盖了Struts2的核心概念和配置细节,对于初学者来说,是理解Struts2工作原理和配置的宝贵资料。 1. Package配置: 在Struts2中,`<package>`元素用来组织和配置相关的Action。`name`属性定义了包...

    spring3.x的读书笔记-2

    在Spring框架中,Resource接口是核心组件之一,用于表示应用程序中的资源,比如文件、网络连接、输入/输出流等。在上述代码示例中,我们可以看到两种Resource的实例化方式:FileSystemResource和ClassPathResource。...

    设计模式-观察者模式(读书笔记)

    观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在很多场景下都有广泛的应用,例如事件处理、...

    java虚拟机源码-openjdk7:openjdk7源码(深入理解java虚拟机,读书笔记)

    1. **类加载器**:负责加载Java字节码文件(.class),将其转换为内存中的Class对象。包括引导类加载器、扩展类加载器和应用程序类加载器等。 2. **运行时数据区**:包括堆、方法区、程序计数器、虚拟机栈和本地...

    java基础语法,适合于初始入门者

    这篇读书笔记主要面向Java初学者,通过分享作者的实践经验,讲解了如何使用IDEA这一强大的Java开发工具。 IDEA,全称为IntelliJ IDEA,是一款被广泛认可的Java和Kotlin开发集成环境。它集成了代码编写、编译、执行...

    Silverlight2 跨域调用Web服务的方法

    确保正确配置了策略文件后,我们可以开始创建一个实际的Silverlight应用来调用Web服务。这里我们以一个简单的例子说明: 1. 创建一个新的Silverlight 2应用程序项目,命名为`SilverlightCrossDomainCallWebService`...

    jakarta-regexp-1.5 正则表达式库

    Jakarta Regexp 1.5 是一个专门为Java开发者设计的开源正则表达式库,它提供了强大的文本匹配和处理功能。这个库源自Apache软件基金会,是许多Java项目中广泛使用的正则表达式实现之一。在Java标准库中,虽然内置了`...

Global site tag (gtag.js) - Google Analytics