class文件结构浅析(2)
欢迎转载,转载需声明出处
------------------
请先看上一篇:Class类文件结构浅析
上一篇讲的都是理论。以下我们亲自实践一下。
public class Test
{
private int m;
private String str; public int func(int m,String str)
{
str += "OK";
m = 10;
return -1;
} public static void main(String[] arg)
{
String str = "test";
int m = 20;
new Test().func(m,str);
}
}
C:\Users\Rowand jj\Desktop>javap -verbose Test
Classfile /C:/Users/Rowand jj/Desktop/Test.class
Last modified 2014-5-2; size 616 bytes
MD5 checksum cfd6b2e7d9d99dda3b84d1dbe87ce657
Compiled from "Test.java"
public class Test
SourceFile: "Test.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #11.#26 // java/lang/Object."<init>":()V
#2 = Class #27 // java/lang/StringBuilder
#3 = Methodref #2.#26 // java/lang/StringBuilder."<init>":(
)V
#4 = Methodref #2.#28 // java/lang/StringBuilder.append:(Lj
ava/lang/String;)Ljava/lang/StringBuilder;
#5 = String #29 // OK
#6 = Methodref #2.#30 // java/lang/StringBuilder.toString:(
)Ljava/lang/String;
#7 = String #31 // test
#8 = Class #32 // Test
#9 = Methodref #8.#26 // Test."<init>":()V
#10 = Methodref #8.#33 // Test.func:(ILjava/lang/String;)I
#11 = Class #34 // java/lang/Object
#12 = Utf8 m
#13 = Utf8 I
#14 = Utf8 str
#15 = Utf8 Ljava/lang/String;
#16 = Utf8 <init>
#17 = Utf8 ()V
#18 = Utf8 Code
#19 = Utf8 LineNumberTable
#20 = Utf8 func
#21 = Utf8 (ILjava/lang/String;)I
#22 = Utf8 main
#23 = Utf8 ([Ljava/lang/String;)V
#24 = Utf8 SourceFile
#25 = Utf8 Test.java
#26 = NameAndType #16:#17 // "<init>":()V
#27 = Utf8 java/lang/StringBuilder
#28 = NameAndType #35:#36 // append:(Ljava/lang/String;)Ljava/l
ang/StringBuilder;
#29 = Utf8 OK
#30 = NameAndType #37:#38 // toString:()Ljava/lang/String;
#31 = Utf8 test
#32 = Utf8 Test
#33 = NameAndType #20:#21 // func:(ILjava/lang/String;)I
#34 = Utf8 java/lang/Object
#35 = Utf8 append
#36 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#37 = Utf8 toString
#38 = Utf8 ()Ljava/lang/String;
{
public Test();
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0 public int func(int, java.lang.String);
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder.
"<init>":()V
7: aload_2
8: invokevirtual #4 // Method java/lang/StringBuilder.
append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: ldc #5 // String OK
13: invokevirtual #4 // Method java/lang/StringBuilder.
append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: invokevirtual #6 // Method java/lang/StringBuilder.
toString:()Ljava/lang/String;
19: astore_2
20: bipush 10
22: istore_1
23: iconst_m1
24: ireturn
LineNumberTable:
line 8: 0
line 9: 20
line 10: 23 public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=3, args_size=1
0: ldc #7 // String test
2: astore_1
3: bipush 20
5: istore_2
6: new #8 // class Test
9: dup
10: invokespecial #9 // Method "<init>":()V
13: iload_2
14: aload_1
15: invokevirtual #10 // Method func:(ILjava/lang/String
;)I
18: pop
19: return
LineNumberTable:
line 15: 0
line 16: 3
line 17: 6
line 18: 19
}
大家可能看的有点晕,不要紧,我们一步一步来分析。以下我们使用winhex打开Test.class文件:
class文件格式以一种类似c语言结构体的伪结构存储,这样的伪结构仅仅有两种数据类型:
整个class文件就是一张表,其结构例如以下:
ClassFile {
u4 magic;//魔数(0xCAFEBABE)
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[attributes_count];//属性表集合
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
第二项常量分析完成,看第三项,tag值为0x0A,又是一个
这正好是0x0020|0x0001(查表),所以訪问标志为ACC_PUBLIC,ACC_SUPER。查看汇编代码:
首先两个字节为字段表计数器。值为0x0002:
头两个字节0x0002为訪问标志,相应的是private:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
整个class文件也分析的差点儿相同了。相信大家看完之后对class文件结构会有进一步的了解的。
class文件结构浅析(2)的更多相关文章
- 《FLASH CC 2015 CANVAS 中文教程》——1、导出canvas动画,文件结构浅析
注::如果你对 FLASH 这个软件操作不够熟悉,建议你可以先看看FLASH动画之类的书. :FLASH CC 在文中直接简称为CC. :以下所以文章中所说的快捷键 如果你按了不起作用,请检查是否有其 ...
- .net core 项目文件结构浅析
1:launch.json (配置调试用的) 通过vs code创建的项目,都会有这个文件,是启动调试的配置文件: (vscode默认支持nodejs调试) 要调试调试c#代码 需要安装 C# 插件 ...
- MXF文件结构浅析
MXF是英文Material eXchange Format(素材交换格式)的缩语.MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式.MXF主要应用于影视行业媒体制作 ...
- 浅析BMP位图文件结构(含Demo)
浅析BMP位图文件结构(含Demo) 作者:一点一滴的Beer http://beer.cnblogs.com/ 关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为“BMP ...
- Mybatis配置信息浅析 MyBatis简介(二)
官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...
- Java网络编程和NIO详解8:浅析mmap和Direct Buffer
Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NI ...
- 宋牧春: Linux设备树文件结构与解析深度分析(1) 【转】
转自:https://mp.weixin.qq.com/s/OX-aXd5MYlE_YoZ3p32qWA 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...
- 焦大:逛网seo案例浅析
http://www.wocaoseo.com/thread-93-1-1.html 逛,发现喜欢.这或许是很多人上网的喜欢方式,我隐约记得白鸦在一次采访上说到现在人的购物方式,在淘宝上人们决定买一件 ...
- 浅析Linux用户空间中的Mmap
一.MMap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采 ...
随机推荐
- RF操作滚动条(竖拉)
方式一:window.scrollBy(0, document.body.scrollHeight) 方式二:window.scrollTo(0, document.body.scrollHeight ...
- Python面试题(练习二)
1.用Python实现一个二分查找的函数. data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def ...
- x86 保护模式 十 分页管理机制
x86 保护模式 十 分页管理机制 8.386开始支持分页管理机制 段机制实现虚拟地址到线性地址的转换,分页机制实现线性地址到物理地址的转换.如果不启用分页,那么线性就是物理地址 一 分页管 ...
- Leetcode 451.根据字符出现频率排序
根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次 ...
- [adb 学习篇] adb常用命令
https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...
- Android强制更新
代码改变世界 Android版本强制更新 package com.lianpos.util; import android.content.Context; import android.conten ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- C# 时间与时间戳互转 13位|13位時間戳与日期换转
这里直接上代码 懂C# 的程序猿 一看便知道如何使用的... /// <summary> /// 将Unix时间戳转换为DateTime类型时间 /// </summary> ...
- POJ——1195Mobile phones(二维树状数组点修改矩阵查询)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 17764 Accepted: 8213 De ...
- javascript中 for循环的一些写法 for length 以及for in 还有 for of 的区别
最近在写一些前端的代码,遇到一个产品列表遍历的问题,正好使用到for 的几种用法,于是研究了下. 代码如下,先说明下goodslist 是一个产品列表 形如这样的数据格式 { ‘types’:1, ' ...