java分布式(java反汇编)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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反汇编)相关推荐
- java分布式锁解决方案 redisson or ZooKeeper
redis 分布式锁 Redisson 是 redis 官方推荐的Java分布式锁第三方框架. 高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设 ...
- 清华学霸花了三年时间对java理解: Java分布式架构
什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...
- 5个强大的Java分布式缓存框架推荐
2019独角兽企业重金招聘Python工程师标准>>> 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没 ...
- 5个强大的Java分布式缓存框架
5个强大的Java分布式缓存框架 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来 ...
- java分布式对象——远程方法中的参数和返回值+远程对象激活
[0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...
- java分布式对象(RMI+部署使用RMI的程序)
[0]README 1)本文文字转自 core java volume 2, 旨在学习 java 分布式对象的相关知识: 2) RMI 的实例程序为原创: 3) RMI部署步骤的测试用例,参见 htt ...
- Java分布式篇6——RabbitMQ
Java分布式篇6--RabbitMQ 1.MQ(Message Queue)消息队列 消息队列中间件,是分布式系统中的重要组件 主要解决,异步处理,应用解耦,流量削峰等问题 实现高性能,高可用,可伸 ...
- Java分布式篇5——FastDFS
Java分布式篇5--FastDFS 分布式文件系统 1.主流的分布式文件系统 1.1. HDFS (Hadoop Distributed File System)Hadoop 分布式文件系统 高容错 ...
- Java分布式篇4——Redis
Java分布式篇4--Redis 1.互联网架构的演变历程 1.1.第一阶段 数据访问量不大,简单的架构即可搞定! 1.2.第二阶段 数据访问量大,使用缓存技术来缓解数据库的压力 不同的业务访问不同的 ...
- JAVA分布式篇3——Dubbo
JAVA分布式篇3--Dubbo 1.架构演变 1.1.单应用架构 当网站流量很小时,只需要一个应用,将所有的功能部署到一起(所有业务都放在一个tomcat 里),从而减少部署节点和成本 用于简化 增 ...
最新文章
- Element 2.6.0 发布,基于 Vue 2.0 的桌面端组件库
- SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
- 42HS48步进电机实验
- 面试:什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?...
- python操作系统-Python_操作系统的发展史
- 放置奇兵 算法 月度活动 破碎时空记录 第四关 双树精(大树)(格鲁)
- QT的QPlaceContent类的使用
- 如何基于 SAP CDS view 生成 object page
- java程序设计p75_java语言程序设计实用教程第四讲控制结构.ppt
- JavaScript基础01
- 重写Checkbox 改写选择框的大小
- php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
- NFS网络文件系统服务配置、验证及错误解决
- Grails 1.2参考文档速读(4):第3章剩余内容
- 关于firefox火狐中localStorage无法正常使用的问题
- 这些Python骚操作,你知道吗?
- LINUX安装fossil
- jQuery漂浮横幅图片广告代码
- element-ui+vue,翻页添加首页、尾页跳转按钮
- 【荐】JS实现类似星球仿flash效果的动态菜单
热门文章
- 牛客网暑期ACM多校训练营(第三场) E Sort String 哈希处理字符串(模板)
- 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool
- How can I set ccshared=-fPIC while executing ./configure?
- 【LetCode算法修炼】Two Sum
- HTML5流量价值最大化-赵伊江
- 使用httpwatch抓包
- JavaScript面试大全(二)
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建项目
- 惠普 Compaq Presario V3704TX改XP实战手记
- 多校#5-1005-Instring-HDU5785-manacher+维护