【小试】解析class反编译文件
源程序:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All rights reserved.
* Author: Jarg Yee <yeshaoting@gmail.com>
* http://jarg.iteye.com/
*/
/*
* 【小试】解析class反编译文件
*/
public class Parse
{
public static void main(String[] args)
{
int x = 7;
int y = 3;
x = x++;
y = ++y;
System.out.println(x);
System.out.println(y);
}
}
反编译后指令:
---------- Java反编译 ----------
---------- Java反编译 ----------
Compiled from "Parse.java"
public class Parse extends java.lang.Object{
public Parse();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 10: 0
public static void main(java.lang.String[]);
Code:
0: bipush 7
2: istore_1
3: iconst_3
4: istore_2
5: iload_1
6: iinc 1, 1
9: istore_1
10: iinc 2, 1
13: iload_2
14: istore_2
15: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_1
19: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
22: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
25: iload_2
26: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
29: return
LineNumberTable:
line 14: 0
line 15: 3
line 16: 5
line 17: 10
line 18: 15
line 19: 22
line 20: 29
}
输出完成 (耗时 0 秒) - 正常终止
解析:
从反编译后的指令可以看出,该Parse类包括二个函数:
1. 默认构造函数 public Parse();
public Parse();调用的是父类java.lang.Object无参构造函数
0: aload_0 从局部变量数组索引0位置加载Object对象的引用到操作数栈
1: invokespecial #1; //Method java/lang/Object."<init>":()V 操作数栈中对象引用调用类java.lang.Object无参构造函数Object()
4: return 方法返回
2. main函数 public static void main(java.lang.String[]);
String类型对象引用args存入局部变量数组索引0位置(对应变量args)
int x = 7;
0: bipush 7 将字面值为7的字节型数据压入操作数栈
2: istore_1 从Java方法栈弹出栈顶数,存入局部变量数组索引1位置(对应变量x)
int y = 3;
3: iconst_3 将字面值为3的整型数据压入操作数栈
4: istore_2 弹出操作数栈栈顶元素,存入局部变量数组索引2位置(对应变量y)
x = x++;
5: iload_1 取出局部变量数组索引1位置的数据(对应变量x),压入操作数栈
6: iinc 1, 1 局部变量数组索引1位置数据(对应变量x)加1
9: istore_1 弹出栈顶元素,存入局部变量数组索引1位置(对应变量x)
y = ++y;
10: iinc 2, 1 局部变量数组索引2位置数据(对应变量y)加1
13: iload_2 取出局部变量数组索引2位置的数据(对应变量y),压入操作数栈
14: istore_2 弹出栈顶元素,存入局部变量数组索引2位置(对应变量y)
System.out.println(x);
15: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 取出System类的java.io.PrintStream类静态域out,压入操作数栈
18: iload_1 取出局部变量数组索引1位置的数据(对应变量x),压入操作数栈
19: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 操作数栈中对象引用out调用类java.io.PrintStream带整型参数的一般方法println()
System.out.println(y); 类同于System.out.println(x);指令过程
22: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 取出System类的java.io.PrintStream类静态域out,压入操作数栈
25: iload_2 取出局部变量数组索引2位置的数据(对应变量y),压入操作数栈
26: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 操作数栈中对象引用out调用类java.io.PrintStream带整型参数的一般方法println()
函数返回,返回类型为void
29: return
以#开头后跟整数对应常量池中数据.
附言: Java中所有的类(除java.lang.Object外)都直接或者间接继承java.lang.Object,即所有的类都是java.lang.Object的直接或者间接子类.
由于Java遵从单继承,若某类已经继承了java.lang.Object以外的类,则此类以属于间接继承java.lang.Object类;否则默认继承java.lang.Object类.
这个结论从反编译后指令public class Parse extends java.lang.Object可看出.
- 大小: 46.8 KB
分享到:
相关推荐
此文档有对爬虫的解析部分做了详细的介绍,非常值得学习和借鉴
通达信指标公式源码 小试牛刀精髓.doc
动画小试-少儿编程scratch项目源代码文件案例素材.zip
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
通达信指标公式源码小试牛刀.doc
牛刀小试 VC++教程高清PDF版.pdf
第5季-小试牛刀-项目开发
牛刀小试C语言基础教学及实践,适合初学者学习。
1. 想象今天你是户外用品的电商,主要销售到美国,你刚建好网站并希望可以增 2. 为什么谷歌分析工具(Google Analytics)跟谷歌广告平台(Goog
1.用ireport软件设计好报表,生成扩展名是".jrxml"和".jasper"文件。 2. src/main/java/com/jasper/example下面是main函数运行jasper文件 参考网站:http://blog.csdn.net/zhouyuanlinli/article/details/8510088 3....
暴雪作业(修改,小试牛刀,大家给点意见[配有音乐)
小试牛刀.exe
apktool 最新版 2.3.0 apktool 最新版 2.3.0 apktool 最新版 2.3.0 apktool 最新版 2.3.0 apktool 最新版 2.3.0
各位同学,此篇文档有助于刚接触Docker学员,请根据文档进行实战一下,有助于加深对Docker的理解
刘易斯小试牛刀.nrp
学汇编最好的入门教程!更浅显,更易懂!从实践出发!
ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)
大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料 大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料
android apk反编译与重编译工具
NULL 博文链接:https://liwenshui322.iteye.com/blog/479782