实例分析Class字节码文件(一)
来源:互联网 发布:nginx apache php性能 编辑:程序博客网 时间:2024/06/06 00:54
一、小试牛刀
要分析的代码如下:
package com.demo6; public class TestClass { private int m; public int inc(){ return m + 1; } }
Class字节码文件部分转化为16进制如下:
根据Class文件格式表:
转换几个:
ca fe ba be
魔数 00 00
次版本号 00 33
主版本号 : JDK 1.7 00 16
常量池容量 :22-1 = 21 07
tag :CONSTANT_Class_info
00 02
name_index
:指向常量池中的第二个常量 [name_index:必须指向的是一个CONSTANT_Utf8_info
] 01
tag : CONSTANT_Utf8_info
00 13
length : 表示字符串长度是多少个字节(13) 63 6f 6d 2f 64 65 6d 6f 36 2f 54 65 73
bytes : com/demo6/TestClass
我们转换了两个常量,剩余19个使用JDK自带工具进行转化:
从上面的清单中,我们能看到常量池具有21个常量,从1开始计数。
第一个常量类型为CONSTANT_Class_info
,并且指向第二个常量;
第二个常量类型为CONSTANT_Utf8_info
,具体指com/demo6/TestClass
;
与我们分析的一致。
二、访问标志
在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类获接口层次的访问信息,包括:
① 这个Class是类还是接口
② 是否定义为public类型
③ 是否定义为abstract类型
④ 是否被声明为final等
access_flags一共有16位可以使用,当前只使用了8个,没有使用到的位一律为0.
具体标识如下:
以上面的代码为例:
0x0001 | 0x0020 = 0x0021
三、类索引、父类索引和接口索引集合
紧接着访问标志后的就是类索引、父类索引和接口索引集合
类索引和父类索引引用两个u2类型的索引值表示,他们各自指向一个类型为CONSTANT_Class_info
的类描述符常量,通过CONSTANT_Class_info
找到CONSTANT_Utf8_info
所表示的字符串。
对于接口索引集合,入口的第一项为u2类型的接口计数器(interfaces_count
),表示实现接口的个数,如果为0,后面接口的索引表不再占用字节。
以上面的代码为例子:
① 类索引指向第一个常量;
② 父类索引指向第三个常量;
③ 接口索引集合为0,不占用任何字节;
- 实例分析Class字节码文件(一)
- 实例分析Class字节码文件(二)
- 实例分析Class字节码文件(三)
- 带你分析字节码-深入理解class(一)
- class文件字节码分析工具:javap
- Java字节码.class文件案例分析
- Java字节码.class文件案例分析
- Java字节码(.class文件)格式详解(一)
- Java字节码(.class文件)格式详解(一)
- Java字节码(.class文件)格式详解(一)
- class 文件java字节码Oolong反编译分析
- .class文件(字节码)的结构
- Java字节码(class文件)解析
- Java 字节码操控框架ASM(一):创建class文件
- 创建一个自定义类加载器实现class文件(字节码文件)的加密解密的实例
- Class的字节码文件
- 带你分析字节码-深入理解class(二)
- 字节码文件class文件的结构
- RecyclerView的用法
- HDU 4553 约会安排(线段树区间合并)
- 经典的测试人员发展路径
- Android 6.0 FloatingActionButton简单使用
- FastDFS文件服务器的搭建与部署(单机版)
- 实例分析Class字节码文件(一)
- 透明窗体
- TCP协议如何进行流量控制
- Fragment中调用startActivityForResult问题
- CCF之门禁系统
- [bzoj2467][中山市选2010]生成树(ksm乱搞)
- 菜鸟的理解——Zookeeper是什么?
- 最小生成树(Prim)代码实现
- gstreamer编程