关于Class文件

简介: 什么是Class文件Java人对class文件肯定很熟悉了,它是Java源码编译后的产物。

什么是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支持才行。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述

目录
相关文章
|
6月前
|
存储 Java 程序员
【 class文件结构】
【 class文件结构】
|
23天前
Class 的讲解
Class 的讲解
11 1
|
5月前
Class下的getEnumConstants
Class下的getEnumConstants
37 0
|
11月前
|
存储 Java 开发者
【Class文件结构】
【Class文件结构】
|
存储 NoSQL Java
class文件结构详解
写在最前:学习class文件结构不像学习JVM内存结构、垃圾收集器那样,可以对我们写代码时有很多帮助,学习了JVM内存结构,我们在配置虚拟机参数时就会有更全面的考虑,写代码时就可以注意到代码的的优化空间,学习了垃圾收集器,让我们可以根据服务器的配置,更好的选择出适合程序最大吞吐量的收集器,更好的根据服务器硬件配置出合适的参数,学习class呢,则更多的是为了让我们知其然,也知其所以然,让我们知道我们写出的代码在JVM里面到底是怎么运行的,这部分内容会相对枯燥,白话多一些,这里主要分两个部分来详细讲述class文件的机构[class文件结构、字节码指令]。
100 0
class文件结构详解
|
JavaScript 前端开发 程序员
Class-总结 class 的基本用法和两个注意点|学习笔记
快速学习 Class-总结 class 的基本用法和两个注意点
127 0
|
JavaScript 程序员
Class-总结class的基本用法和两个注意点
一、注意点一:class关键字区间使用 二、注意点二:Class关键字内部函数
|
关系型数据库 MySQL Linux
class6
快速搭建LAMP坏境
303 0
class4
安装putty工具远程连接ECS服务器
165 0
|
存储 弹性计算 负载均衡
class2
ecs服务器购买和准备
303 0