关于Class文件
什么是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文件的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- static class 静态类(Java)
一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...
- Spring Cloud 服务端注册与客户端调用
Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...
- Tarjan笔记1
Tarjan 2822 爱在心中 ** 时间限制: 1 s ** 空间限制: 128000 KB ** 题目等级 : 钻石 Diamond 题解 题目描述 Description"每个人都拥 ...
- 热烈庆祝自已厉精13年开发的 DB查询分析器 7.01(最新版本) 在中关村在线本月获得近6000次的下载量
中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本 DB 查询分析器.英文版本DB Query Analyzer.它 ...
- [CSDN_Markdown] 使用CSDN Markdown编辑器
简介 最近CSDN支持Markdown语法写博客了,甚是欢喜.前几天写了一篇实验了下,感觉不错.准备写几篇文章介绍一下如何使用CSDN的Markdown编辑器写博客,不求全面,但求够用,望大家批评指正 ...
- 无需密码通过scp命令+key的方式实现文件传输
如果觉得scp每次都要输入密码很麻烦, 那么这是解决方案.假设你平时在windows上开发,用户名是xiang, 你有一台Ubuntu服务器wdksw.com, 用户名是root.现在你准备上传一些文 ...
- 24 AIDL案例
服务端 MainActivity.java package com.qf.day24_aidl_wordserver; import android.app.Activity; import andr ...
- norflash芯片内执行(XIP)
为什么程序不能直接在nandflash上执行?出于这个疑惑带来了这篇博文,是我在网上找了很多资料后总结的,假如有误,希望马上指出来,免得我误人子弟.谢谢! nandflash和norflash NOR ...
- Swift中使用NSLog的问题
在Swift中如果想要以如下方式执行NSLog,则编译器必定抱怨: class Foo {} NSLog("%@",Foo()) 因为Foo是原生Swift类不是继承自NSObje ...
- SpriteKit游戏Delve随机生成地牢地图一个Bug的修复
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图 ...