解读Java Class文件格式

本文介绍了一个工具,用于解析Java Class文件并生成Java源代码,旨在简化大型软件系统的单元测试。该工具根据Class文件格式规范,利用VC++读取并解析Class文件,然后生成Java源文件,其中API方法被替换成简单的返回值,便于测试。虽然工具无法完全反编译Bytecode,但能帮助开发者理解无源代码的Class文件内容,并生成可调试的替代源代码。
摘要由CSDN通过智能技术生成

1目的

大型软件系统开发时,某些Java组件可能涉及到多种数据库或中间件系统的连接和应用,例如一个数据传递组件需要从DB2中读取数据,并将数据通过中间件WebSphere MQ发送到其他系统,这类组件功能单一,但却需要连接多种第三方产品,使得程序员的单元测试变的非常不便,程序员不得不注视或修改部分源代码,或者在本地安装所需第三方产品。无疑这两种选择都是痛苦的。

基于以上的不便,本文开发了解析Java Class文件程序,目的是将第三方产品APIClass文件转换为Java源文件(不包括Java类的方法实现),在源文件的各种程序所需的方法里实现一些简单的语句,例如数据库连接方法永远返回true,获得数据方法永远返回 ”Hello world” 等,用JDK重新编译转换后的Java源文件,来替换真正的API 文件,这样程序员在UT测试时,无需修改源代码,也无需安装任何产品,并且能通过修改替换的API Java源文件实施各种UT测试。

为了实现以上需求,必须先要了解Java Class文件格式。Java虚拟机识别的class文件格式包含Java虚拟机指令(或者bytecodes)和一个符号表以及其他的辅助信息。本文将使用VC++语言解析Java Class文件符号表,逆向生成Java源代码结构。如图1

                                                                                          图1

之所以使用VC++而不使用Java的主要是因为VC++界面开发简单;运行速度快,不需要虚拟机;需要用指针建立复杂的数据结构。

2实现

实现该工具的过程如下:

1.解析Class文件,从Class文件中读取数据并保存到称为ClassFile结构体中;

2.解析ClassFile结构体,生成源代码字符串;

3.将字符串显示到视图中。

2.1 解析Class文件

为实现第1步,首先需要了解Class文件格式规范,参考《Java虚拟机规范》第四章class文件格式,总结class文件的数据结构如图2

2.1.1 Class文件格式

Class文件格式ClassFile结构体的C语言描述如下:

struct ClassFile

{

              u4 magic;                                 //识别Class文件格式,具体值为0xCAFEBABE

              u2 minor_version;            // Class文件格式副版本号,

              u2 major_version;            // Class文件格式主版本号,

              u2 constant_pool_count; //  常数表项个数,

              cp_info **constant_pool;// 常数表,又称变长符号表,

              u2 access_flags;               //Class的声明中使用的修饰符掩码,

              u2 this_class;                   //常数表索引,索引内保存类名或接口名,

              u2 super_class;                //常数表索引,索引内保存父类名,

              u2 interfaces_count;        //超接口个数,

              u2 *interfaces;                 //常数表索引,各超接口名称,

              u2 fields_count;       //类的域个数,

              field_info **fields;          //域数据,包括属性名称索引,

//域修饰符掩码等,

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值