解析class反编译文件

转载 2012年03月21日 19:57:16

解析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: 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可看出.

 

原文:http://jarg.iteye.com/blog/1005685
 

java 反编译器源码分析

简介由于工作需要反编译分析 java 源码,于是需要反编译器做些改动,所以就有了这篇文章。 这次要分析的反编译器是 Femflower,是著名 IDE Idea 的反编译器。源码也是从 Idea 开源...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Go 语言常量

Go 语言常量常量是一个简单值的标识符,在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式:const identifier [ty...

linux找不到网卡配置文件解决办法

场景:在虚拟机系统中,在设置网卡信息时,ifconfig看到有网络信息,但是在/etc/sysconfig/network-script/目录下找不到对应的网卡配置文件。 解决:重建网卡配置...
  • atco
  • atco
  • 2016年04月01日 16:18
  • 2691

反编译java中class文件

  • 2017年11月23日 09:15
  • 800KB
  • 下载

Mac下的jad: 反编译class文件

  • 2017年11月03日 03:49
  • 170KB
  • 下载

Eclipse反编译插件JadClipse安装(用于打开.class文件)

前言:在实际开发中几乎都会使用到一些框架来辅助项目的开发工作,对于一些框架的代码我们总怀有一些好奇之心,想一探究竟,有源码当然更好了,对于有些JAR包中的代码我们就需要利用反编译工具来看一下了。 1...

Xjad java class文件反编译工具

  • 2015年08月10日 17:54
  • 800KB
  • 下载

java编程程序class文件反编译

  • 2015年08月01日 17:53
  • 639KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解析class反编译文件
举报原因:
原因补充:

(最多只允许输入30个字)