【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

学过c或者cpp的同学都知道,exe或者dll、so、a文件都可以反汇编成对应的汇编文件。当然,这个和对应的cpu也有关系。比如,如果是x86程序,那么只能翻译成x86的代码,如果是arm的程序,那么只能反汇编成对应的arm程序。这个时候,很多同学会说,如果是java的程序,有没有办法看到对应的反汇编代码。其实是可以的。对应的工具就是javap程序。

1、编写简单的java代码

import java.io.*;public class hello {public static void main(String args[]){process p = new process();int val = p.iterate(10);System.out.println(val);}
}class process
{public static int iterate(int data){if(1 == data)return 1;elsereturn iterate(data-1)+data;}public int  show(int data){int i;int total;total = 0;for(i = 0; i < data; i++){total += i;}return total;}
}

2、编译java程序

javac hello.java

3、观察是否生成了两个class文件,运行hello

java hello

4、如果hello中有正常的结果,那么就可以确认程序执行成功

55

5、查看hello的反汇编

javap -c hello

6、hello的反汇编为

Compiled from "hello.java"
public class hello {public hello();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new           #2                  // class process3: dup4: invokespecial #3                  // Method process."<init>":()V7: astore_18: aload_19: pop10: bipush        1012: invokestatic  #4                  // Method process.iterate:(I)I15: istore_216: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;19: iload_220: invokevirtual #6                  // Method java/io/PrintStream.println:(I)V23: return
}

7、反汇编process

javap -c process

8、process的反汇编代码为

Compiled from "hello.java"
class process {process();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic static int iterate(int);Code:0: iconst_11: iload_02: if_icmpne     75: iconst_16: ireturn7: iload_08: iconst_19: isub10: invokestatic  #2                  // Method iterate:(I)I13: iload_014: iadd15: ireturnpublic int show(int);Code:0: iconst_01: istore_32: iconst_03: istore_24: iload_25: iload_16: if_icmpge     199: iload_310: iload_211: iadd12: istore_313: iinc          2, 116: goto          419: iload_320: ireturn
}

9、分析汇编代码

不妨以类process为例,从反汇编来看,总共有3个函数,分别是process()、iterate()、show()

其中process()源代码中并没有涉及,这个应该是默认编译的

另外整个java汇编的意义也并不复杂,我们以iterate为例,依次阅读,

指令总共编号到15,

指令0:取常数0

指令1:取输入参数

指令2:常数0和输入参数比较,如果相等,继续执行;如果不等,跳到7

指令5:取常数1

指令6:函数返回

指令7:加载输入参数

指令8:加载常数1

指令9:调用isub函数

指令10:继续调用static iterate函数

指令13:加载输入参数

指令14:调用isub函数

指令15:函数返回

10、小技巧

单独学习汇编是非常枯燥的,可以一边写java程序,一边用javap反汇编成汇编代码的形式,

常常可以达到事半功倍的效果,

这样写的java代码都是已知的,这个时候可以一边学习汇编,一边猜具体汇编的意思,

逐步通过赋值、判断、循环、类、静态类这些代码,慢慢掌握整个java反汇编的指令意义。

其他:

现在android的虚拟机多采用smaili汇编,和这个差不多。可以无缝转过去的。

https://segmentfault.com/a/1190000012669267

当然和java反汇编比较,重点还是c&c++的反汇编,这部分有点复杂,还要需要学习不同cpu的指令集,比如x86、arm指令集,这部分要多多掌握。

java分布式(java反汇编)相关推荐

  1. java分布式锁解决方案 redisson or ZooKeeper

    redis 分布式锁 Redisson 是 redis 官方推荐的Java分布式锁第三方框架. 高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设 ...

  2. 清华学霸花了三年时间对java理解: Java分布式架构

    什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...

  3. 5个强大的Java分布式缓存框架推荐

    2019独角兽企业重金招聘Python工程师标准>>> 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没 ...

  4. 5个强大的Java分布式缓存框架

    5个强大的Java分布式缓存框架 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来 ...

  5. java分布式对象——远程方法中的参数和返回值+远程对象激活

    [0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...

  6. java分布式对象(RMI+部署使用RMI的程序)

    [0]README 1)本文文字转自 core java volume 2, 旨在学习 java 分布式对象的相关知识: 2) RMI 的实例程序为原创: 3) RMI部署步骤的测试用例,参见 htt ...

  7. Java分布式篇6——RabbitMQ

    Java分布式篇6--RabbitMQ 1.MQ(Message Queue)消息队列 消息队列中间件,是分布式系统中的重要组件 主要解决,异步处理,应用解耦,流量削峰等问题 实现高性能,高可用,可伸 ...

  8. Java分布式篇5——FastDFS

    Java分布式篇5--FastDFS 分布式文件系统 1.主流的分布式文件系统 1.1. HDFS (Hadoop Distributed File System)Hadoop 分布式文件系统 高容错 ...

  9. Java分布式篇4——Redis

    Java分布式篇4--Redis 1.互联网架构的演变历程 1.1.第一阶段 数据访问量不大,简单的架构即可搞定! 1.2.第二阶段 数据访问量大,使用缓存技术来缓解数据库的压力 不同的业务访问不同的 ...

  10. JAVA分布式篇3——Dubbo

    JAVA分布式篇3--Dubbo 1.架构演变 1.1.单应用架构 当网站流量很小时,只需要一个应用,将所有的功能部署到一起(所有业务都放在一个tomcat 里),从而减少部署节点和成本 用于简化 增 ...

最新文章

  1. Element 2.6.0 发布,基于 Vue 2.0 的桌面端组件库
  2. SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
  3. 42HS48步进电机实验
  4. 面试:什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?...
  5. python操作系统-Python_操作系统的发展史
  6. 放置奇兵 算法 月度活动 破碎时空记录 第四关 双树精(大树)(格鲁)
  7. QT的QPlaceContent类的使用
  8. 如何基于 SAP CDS view 生成 object page
  9. java程序设计p75_java语言程序设计实用教程第四讲控制结构.ppt
  10. JavaScript基础01
  11. 重写Checkbox 改写选择框的大小
  12. php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
  13. NFS网络文件系统服务配置、验证及错误解决
  14. Grails 1.2参考文档速读(4):第3章剩余内容
  15. 关于firefox火狐中localStorage无法正常使用的问题
  16. 这些Python骚操作,你知道吗?
  17. LINUX安装fossil
  18. jQuery漂浮横幅图片广告代码
  19. element-ui+vue,翻页添加首页、尾页跳转按钮
  20. 【荐】JS实现类似星球仿flash效果的动态菜单

热门文章

  1. 牛客网暑期ACM多校训练营(第三场) E Sort String 哈希处理字符串(模板)
  2. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool
  3. How can I set ccshared=-fPIC while executing ./configure?
  4. 【LetCode算法修炼】Two Sum
  5. HTML5流量价值最大化-赵伊江
  6. 使用httpwatch抓包
  7. JavaScript面试大全(二)
  8. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建项目
  9. 惠普 Compaq Presario V3704TX改XP实战手记
  10. 多校#5-1005-Instring-HDU5785-manacher+维护