什么是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. npm ERR! Windows_NT 10.0.10586

    安装vue脚手架时候一直失败,如图: npm cache clean 管理员下安装: 快捷键 win +x , 按A进入:

  2. Java实现23种设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  3. 使用webpack-dev-server设置反向代理解决前端跨域问题

    webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.j ...

  4. 47. Permutations II(medium, backtrack, 重要, 条件较难思考)

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  5. 剑指架构师系列-spring boot的logback日志记录

    Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...

  6. golang 线程与通道

    首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行.golang的线程是一种并发机制,而不是并行.它们之间的区别大家可以上网搜一下,网上有很多的介 ...

  7. Android音频焦点处理相关的方法

    有这么一种场景:你打开qq音乐.优酷客户端.视频播放的时候.这个时候突然来电显示了,此时所有的MediaPlayer相关的服务或者响应都进入"休眠"状态.那么,这个功能是怎么实现的 ...

  8. 在java程序中实现发送邮件的功能

    最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能.这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能. 首先我们需 ...

  9. 微信小程序基础之试图控件View、ScrollView、Swiper

    今天写一篇关于微信小程序视图控件的文章,主要是介绍界面的搭建和部分操作js交互功能的介绍,转载请注明出处,谢谢~ 首先显示首页结构.创建三个navigator,用来跳转页面: <!--index ...

  10. ROS(indigo) 用于机器人控制的图形化编程工具--code_it robot_blockly

    0 简介: 编程语言有汇编,高级语言,解释语言等,现在图形化编程也越来越流行.图形化编程简单易学.8年前,微软推出了VPL用于机器人程序设计,如Python和JavaScript都可以用图形化框图实现 ...