文档章节

Class文件解读(一)

打破突破
 打破突破
发布于 2017/04/09 21:40
字数 1288
阅读 94
收藏 0
点赞 0
评论 0

        java虚拟机规范中的java虚拟机的跨语言性及跨平台性,多半归功于定义中的Class文件,Class文件解耦了虚拟机平台的具体实现与具体的编程语言,也业务开发角度理解,可以将它抽象成接口对接文档(当然只是为了方便理解),既然是已经拟定的文档,那么必然存在一定的规则,在了解具体Class文件规范之前需要对Class文件有一个整体的认识。

        首先Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当需要需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

        根据java虚拟机规范的规定,Class文件格式采用类似于c语言中结构体的伪结构(仅仅是数据组合的一种既定方式)来存储数据,在该伪结构中只有两种数据类型:无符号数和表。

        无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、和8个字节的无符号数,常用于表述数字(比如常量池的count、方法表count、属性表count等)、索引引用、数值量或按照UTF-8编码构成的字符串值。

        表在结构上是由无符号数和其他表构成的用语表述具有层次关系的复合结构,整个class文件也可以看成是一张特殊的表。

在介绍具体的Class文件结构之前,需要提醒的是class文件中对于字节码的顺序、长度都有严格的定义,具体的虚拟机实现必须遵循这样的规范(不然一次编译到处运行只能是梦想),当然Class文件规范中也允许虚拟机实现在遵循java标准虚拟机规范的前提下自由定义其他属性以提高虚拟机在某方面的性能。

Class文件结构:

            

       无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式(这应该比较好理解,很多协议中都用了类似的思想,在数据报文头中先告诉接受端报文内容的整体信息,根据这些信息去解析报文数据,如netty中的编码器和解码器、http协议等),这时称这一系列连续的某一类型的数据为某一类型的集合。

详解Class文件结构:

为方便进一步理解,将使用下面的例子进行讲解:

package org.lucas.clazz;

/**
 * Created by BG260733 on 2017-04-09.
 */
public class TestClass {

    private int n;

    private static final int m = 5;

    public int inc() {
        return m + n;
    }

}

说明:以下class文件均由winHex十六进制打开。

magic:

       每个class文件的头4个字节称为魔数(Magic Number),它的唯一作用时确定这个文件是否为一个能被虚拟机接受的class文件(不代表能成功解析)。很多文件存储标准中都是在文件内容中嵌入魔术来进行身份识别,之所以不使用文件名(包括后缀)来作为文件的识别方式,主要是出于安全方面的考虑,文件名可能会被外部频繁改动。Class文件的魔术值为:OxCAFEBABY,是不是自带浪漫气息。

minor_version

        仅接着魔数后面的第5个和第6个两个字节,表示能够解析执行该class文件的虚拟机次版本号。

major_version

        第7个和第8个两个字节,表示能够解析执行该class文件的虚拟机主版本号。

            

下表列出了从JDK1.1到JDK1.7,主流JDK版本编译器输出的默认和可支持的Class文件版本号。

           

        -target标志表示允许编译器生成特定版本的Java类文件格式。

        -source标志表示允许编译器将新的语言构造(如Lambda表达式、try-with-resources以及switch中使用字符串等等)看做错误。一些新语言特性(比如Lambda表达式)需要使用特定的字节码功能(比如invokedynamic),因此,-source指定的版本比-target指定的版本还新往往是不可能的。

 

博主本打算将Class文件所有内容由一篇文章讲述清楚、但实际编写过程中发现待表述的信息量还是太大,为了方便读者阅读,特将此篇分为五到六篇文章,未完待续~

 

下篇:https://my.oschina.net/u/3345762/blog/880152

 

© 著作权归作者所有

共有 人打赏支持
打破突破

打破突破

粉丝 24
博文 25
码字总数 27131
作品 0
杭州
高级程序员
SAS创建宏变量的七种方法

学会创建宏变量,特别是全局宏变量是应用宏的一个基础,下面我们介绍一下,创建宏变量的七种方法,并通过例子来演示。 1.通过宏函数创建宏变量。 %let dsid=%sysfunc(open(sashelp.class));...

开拓者-2017
2016/03/01
161
0
android应用程序的混淆打包

1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示: target=android-8 proguard.config=proguard.cfg Eclipse会通过此配置在工程目录生成proguard.cfg文件......

AlexZhuang
2012/04/11
0
0
Runtime之消息发送和消息转发

简介: 如果消息含有参数,则为: 1、消息发送机制 检查selector 是否需要忽略 检查target是否为nil,如果为nil,直接cleanup,然后return(这就是为什么可以向nil发送消息的原因) 然后在t...

Tonyliu_
04/19
0
0
java输入输出到文件

一、java读取txt文件内容。可以作如下理解: 首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。 通过这条线路读取甲方的...

u012654154
2017/06/02
0
0
FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码

本文来自诗商·柳惊鸿 Poechant CSDN博客,转载请注明源地址:FastDFS的配置、部署与API使用解读(2)上传文件到FastDFS分布式文件系统的客户端代码 在阅读本文之前,请您先通过《FastDFS的配...

晨曦之光
2012/04/24
416
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
07/16
0
0
iOS 简单粗暴的浅谈类与对象

简介: 在Objective-C语言中,每一个地方我们都在面对类与对象,比如说一个控件、一个字符串、一张图片、包括我们所说的NSObject等等都可以看做对象,那么Objective-C的类呢也就是所谓的Class...

吃粑粑的毕教授
2017/10/09
0
0
Android混淆打包-通过proguard配置实现

1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示: target=android-8 proguard.config=proguard.cfg Eclipse会通过此配置在工程目录生成proguard.cfg文件......

boonya
2016/07/20
18
0
FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解

《Poechant的FastDFS的配置、部署与API使用教程》 FastDFS的配置、部署与API使用解读——(1)入门使用教程 FastDFS的配置、部署与API使用解读——(2)Java API:根据InputStream、文件名、...

晨曦之光
2012/04/24
2.9K
0
Process Engine 流程引擎

一、介绍 processengine 描述一个引擎来建立和解读一个进程的内存结构。此存储器中表示形式基于节点。要建立一个正确的对象树,一个 processdefinition.xsd 文件是使用 JAXB 。这种 processi...

C-Kellen
2016/06/16
55
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高效编写Dockerfile的几条准则

概述 Dockerfile 是专门用来进行自动化构建镜像的编排文件(就像Jenkins 2.0时代的Jenkinsfile是对Jenkins的Job和Stage的编排一样),我们可以通过 docker build 命令来自动化地从 Dockerfi...

小致dad
56分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
7
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
198
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部