什么是Class文件

Java人对class文件肯定很熟悉了,它是Java源码编译后的产物。JVM运行时负责加载class文件,并根据class定义的执行逻辑运行。java为了将硬件底层的差异屏蔽掉,引入了Java虚拟机(JVM)并将硬件差异处理都放到JVM中,所以可以编译出统一的二进制文件——class。所以只要通过编译器编译成规范的class文件都可以在JVM上面运行,像现在很多其他语言其实都是编译成class文件并运行在JVM上,例如Scala、JRuby、Groovy、Clojure等等。

class字节码作为java虚拟机的语言,java虚拟机规范规定了class文件的结构,JVM运行时类加载器就会对这些class字节码进行加载。这里并不深入讨论JVM对于class字节码的处理,而是主要了解class文件的结构,因为tomcat的实现涉及到了class相关知识。

Class文件结构

每个class文件包含一个类或者接口的Java类型,class文件以8位字节为基础的二进制流,每个数据项的顺序和占用字节数都有严格的规定。一个class文件的基本结构如下:

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

}

class文件结构主要包含两种数据类型,其中u开头表示无符号数,u1表示1个字节,u2表示2个字节,u4表示4个字节;另外一些为xxx_info,它是一种表结构,里面又包含了若干的无符号数和表结构。

  • ①magic,即魔数,每个class文件开头4个字节,它的值固定为0xCAFEBABE,用于标识是否为class文件。
  • ②minor_version和major_version,表示编译器使用的JDK的副版本和主版本,高版本编译的class文件可以向下兼容低版本,即高版本JDK可以运行低版本的class,而低版本的JDK不能运行高版本的class。
  • ③constant_pool_count,表示常量池计数器,但这里有个比较特殊的地方,假如它的值为100,则常量池的常量数为99个。因为常量池的计数是从1开始的。
  • ④constant_pool,表示常量池的数据集合,常量池中每个常量都是一个表结构表示,这些表结构一共包括11种,其中主要包括的类型为:utf-8字符串、整型、浮点型、长整型、双精度浮点型、类或接口引用、字符串类型、字段引用、类方法引用、接口方法引用、名称和类型引用。
  • ⑤access_flags,表示访问标识,用于标识类或接口的访问信息,例如是否为public类型、是否被声明为final、是否是一个接口、是否为abstract类型、是否为注解、是否为枚举等等。
  • ⑥this_class,表示此类的全限定名(全限定名的格式:例如com.test.MyTomcat”类的全限定名为”com/test/MyTomcat;”)。
  • ⑦super_class,表示此类的父类的全限定名。
  • ⑧interfaces_count,表示此类实现接口的计数器,如果为3,则表示实现了3个接口。
  • ⑨interfaces,表示类实现的接口集,它的每个值都必须是常量池里的有效引用。
  • ⑩fields_count,表示字段计数器。
  • ⑪fields,表示类的字段集,每个字段表结构包括:访问标识、字段名引用、字段描述符引用、属性计数器、属性表结构集等等。其中字段描述符使用了简称表示,例如B表示byte类型,所有的类型包括:B-byte、C-char、D-double、F-float、I-int、J-long、S-short、Z-boolean、V-void、L-对象类型,如:Ljava/lang/String;。除此之外数组则用 [ 表示,例如double[][] d的类型为 [[D ,而String[] s的类型则为[Ljava/lang/String。
  • ⑫methods_count,表示方法计数器。
  • ⑬methods,表示类的方法集,每个方法表结构包括:访问标识、方法名引用、方法描述符引用、属性计数器、属性表结构集等等。其中方法描述符应该按先参数列表,后返回值的顺序进行描述,而且参数列表按照参数顺序放”()”之内,如:方法”String get(long id,String name)”的描述符为”(J,Ljava/lang/String;)Ljava/lang/String;”
  • ⑭attributes_count,表示class的属性计数器。
  • ⑮attributes,表示class的属性,属性表结构集不要求严格的顺序,只要属性名称不与存在的属性名重复即可,虚拟机规范中规定了9个属性,除此之外还可以自己定义一些属性并自己实现编译器把属性添加到class文件中,JVM运行时会把不能识别的属性忽略,而不会影响运行。所以添加了属性还得JVM支持才行。

关于Class文件的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  5. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  8. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  10. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

随机推荐

  1. c#默认类的修饰符。

    类的默认修饰符是internal  当其修饰符为internal时,其他模块不能访问该类, 所以class类的修饰符一般为public

  2. JAVA局部内部类

    在刚刚学到的android开发中了解到Button的onClick是通过局部内部类的方式实现的,具体的原理我以后再去了解,只是遇到问题总是想知道为什么,不要告诉我这是规则,死记住就可以了. 问题是局部 ...

  3. 排序分析函数中对null的处理

    --排序分析函数中对null的处理 --分析:对于null在分析函数中是升序默认是nulls last,降序默认是nulls first.如果不指定排序,那么是升序 )); ,'测试1'); ,'测试 ...

  4. 代码之间-论文修改助手v1.0版本发布

    论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...

  5. delphi 面向对象实用技能教学一(递归)

    本例使用类与TList相结合,用简洁的方法,实现了一个 HTML 解析与格式化功能.所用到的知识点如下:1.类的提前申明2.TList用法3.String的指针操作4.单例设计5.递归用法 编程是综合 ...

  6. Python3 MySQL 数据库连接

    什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...

  7. Python能做些什么?

    前言 网上搜集到的一些python能做什么的资料,利用python能做很多事情,我们可以在多门课程中都使用Python作为我们的教学语言.比如,计算机网络.数据结构.人工智能.图像处理.软件分析与测试 ...

  8. MySQL系列教程(五)

    MyCAT MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远 ...

  9. 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时

    #include <iostream> using namespace std; void txsort(int* arr, int len) { if (!arr || len == 1 ...

  10. 粗糙的es6 -> es5转换正则集

    (r'() => {}','function () {return {}}'), # (r'\{\.\.\.(.+?)\}','Object.assign({}, \\1)') , # (r'( ...