`
yeshaoting
  • 浏览: 684570 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【小试】解析class反编译文件

    博客分类:
  • J2SE
阅读更多

【小试】解析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
0
0
分享到:
评论

相关推荐

    apktool 2.3.0 最新版 apk反编译工具

    当一个APK被反编译,它的原始资源文件、XML布局文件和Java字节码将被提取和解析,以便于开发者分析、修改或优化。 Apktool的工作流程包括以下几个关键步骤: 1. **解包**: Apktool首先会将APK文件解压,将里面的...

    动画小试-少儿编程scratch项目源代码文件案例素材.zip

    《动画小试——少儿编程Scratch项目源代码解析》 Scratch,一款由麻省理工学院(MIT)的“终身幼儿园团队”开发的图形化编程工具,专为儿童设计,旨在激发他们的创新思维和逻辑能力。这个名为"动画小试"的项目,是...

    linux小试牛刀-项目开发

    6. **编译和加载驱动**:驱动程序作为内核模块编译,可以通过insmod、modprobe或编译进内核的方式加载到系统中。 7. **调试技巧**:包括使用dmesg查看内核日志、gdb进行内核模块调试、sysfs和procfs来获取设备信息...

    apktool(包含签名文件)

    1. **反编译**:将APK文件中的.dex(Dalvik执行文件)转换为.java源代码,.xml文件转换为文本格式。 2. **重构**:允许用户修改反编译出的源代码和资源文件,如修改布局、字符串、图片等。 3. **重新打包**:将修改...

    牛刀小试C语言基础教学及实践

    "牛刀小试C语言基础教学及实践"这套教程显然是为了帮助初学者建立起扎实的C语言基础。 在C语言的学习中,首先会接触到的是基本的语法结构。这包括变量的声明、数据类型(如int、float、char等)、运算符(如算术...

    牛刀小试VC

    在《牛刀小试VC》中,读者将逐步了解如何利用VC++来创建、编译和调试C++程序。 首先,教程可能会介绍如何安装和配置VC++环境,包括设置开发环境、创建新项目以及管理工程文件。这部分内容对于初学者来说至关重要,...

    JSP FileUpload方式上传 一个小试例

    这个库可以帮助我们解析`multipart/form-data`编码的请求,方便地获取文件内容。 4. **文件存储**: 获取到文件后,我们需要将其保存到服务器的某个位置。可以自定义保存路径,同时要考虑安全性和性能,比如限制...

    Android 小试牛刀(一)

    Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497

    牛刀小试的汇编教程,很好的入门教材!

    6. **实践项目**:通过编写简单的程序,如计算器、文件操作等,来加深对汇编语言的理解和应用。 【“牛刀小试”教程内容预期】 “牛刀小试的汇编教程”很可能包含了以上提到的各个学习点,并且强调实践性。它可能...

    通达信指标公式源码 小试牛刀精髓.doc

    本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...

    通达信指标公式源码小试牛刀.doc

    本文件“通达信指标公式源码小试牛刀.doc”分享了一些自定义的技术指标公式,以下是对这些公式的详细解读: 1. **VAR1**:这是基于N日最低价(LLV)和最高价(HHV)计算的一个动量指标。它通过计算收盘价相对于价格...

    Java小试一个播放音乐器

    本项目就是一个很好的例子——“Java小试一个播放音乐器”,它是一个简单的音乐播放程序,专门用于播放wav格式的音频文件。 在Java中实现音乐播放功能,主要涉及到以下几个核心知识点: 1. **音频文件处理**:Java...

    小试牛刀代码(用于借鉴)

    "out"目录通常是编译后的输出文件,包括编译后的字节码文件(.class)和其他构建过程中的临时文件。 对于“小试牛刀代码”这个描述,我们可以理解为这是一些用于学习和参考的简单代码片段,可能涉及到使用JDBC执行...

    第二周牛刀小试测试题答案1

    【知识点详解】 1. 营销漏斗理论:在描述中提到的“营销漏斗”,是指潜在客户从认知品牌到最终购买的过程,通常分为曝光与发现、考虑与购买意图、采取行动和复购等阶段。对于刚建立的户外用品电商网站,目标是增加...

    jquery小试牛刀

    《jQuery小试牛刀》 在Web开发领域,jQuery是一个不可或缺的JavaScript库,它极大地简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。本文将深入探讨jQuery的核心概念和常见用法,帮助读者更好地理解和运用这...

    暴雪作业(修改,小试牛刀,大家给点意见[配有音乐)

    暴雪作业(修改,小试牛刀,大家给点意见[配有音乐)

    小试牛刀.exe

    小试牛刀.exe

    UML小试。。。

    标题中的“UML小试”指的是使用统一建模语言(Unified Modeling Language)进行初步尝试或学习。UML是一种标准化的图形表示法,用于软件工程和其他领域中系统、软件以及业务流程的建模。它提供了多种图表类型,如用...

Global site tag (gtag.js) - Google Analytics