解析class反编译文件
来源:互联网 发布:怎样备份数据库 编辑:程序博客网 时间:2024/05/17 22:25
解析class反编译文件
java源码:
/** * 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: 0public 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可看出.
原文:http://jarg.iteye.com/blog/1005685
- 解析class反编译文件
- class文件的反编译
- jad反编译class文件
- 反编译class文件有关
- 反编译CLASS文件
- jad反编译.class文件
- class文件反编译总结
- MyEclipse反编译Class文件
- Java-----反编译class文件
- Javap反编译class文件
- 修改.class文件,反编译.
- class文件不能反编译
- Java的class文件反编译
- JAVA反编译CLASS文件文档
- 使用jad反编译class文件
- eclipse反编译class文件插件
- 反编译 class 为 java 文件
- java class文件反编译插件
- Java程序的编码规范
- jQuery常见的二十五种选择器
- mysql 5 的安装方法及常用命令
- 审查Java代码的十一种常见错误
- Nao机器人之刷新USBKey
- 解析class反编译文件
- 英文求职面试常见问题及应对技巧
- 4大学生为进京指标被骗3.2万
- Java开发必读 解决Java EE的乱码问题
- poj1828
- Spring 框架的设计理念与设计模式分析
- C++模板使用的一点心得
- ASP.NET Session的七点认识
- 基于J2EE网银系统的安全系统解决方案概述