什么是编译

编译:

  • 将高级语言翻译成汇编语言或机器语言的过程 Java语言中的编译一般指将Java文件转换成class文件

顾名思义反编译就是编译的逆向过程

反编译:

  • 将汇编语言或机器语言反编译成高级语言的过程 Java语言中的反编译一般指将class文件转换成java文件

怎么实现编译和反编译

编译

Java的编译分为两步:
1)前端编译: * . java文件转换为 * .class文件(字节码文件)。Java的前端编译器主要是javac, Eclipse JDT 中的增量式编译器 ECJ 等。
2)后端编译:在经过后端编译器,将class字节码文件,编译成机器语言。Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。

反编译

  • 反编译作用

学习Java的一种方法。Java中源代码为.java文件,然后经过编译后生成计算机可识别的.class文件,但是.class文件是计算机识别的,因此需要反编译变成程序员能看懂的代码,但是反编译后的代码并不是和源码一模一样,而是非常接近的。并且经过反编译,也可以学习别人的代码。

  • 反编译方法

Java文件编译后编程字节码文件(class文件),我们无法看懂,要是想要看懂就需要反编译。反编译的一种简单方法:(使用IDEA)把class文件,拖拽到IntelliJ IDEA工具中,IntelliJ自动进行反编译

javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件,也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例,

public class switchDemoString {public static void main(String[] args) {String str = "world";switch (str) {case "hello":System.out.println("hello");break;case "world":System.out.println("world");break;default:break;}}
}

通过javap反编译过后是这样的

public class com.hollis.suguar.switchDemoString {public com.hollis.suguar.switchDemoString();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: ldc           #2                  // String world2: astore_13: aload_14: astore_25: iconst_m16: istore_37: aload_28: invokevirtual #3                  // Method java/lang/String.hashCode:()I11: lookupswitch  { // 299162322: 36113318802: 50default: 61}36: aload_237: ldc           #4                  // String hello39: invokevirtual #5                  // Method java/lang/String.equals:(Ljava/lang/Object;)Z42: ifeq          6145: iconst_046: istore_347: goto          6150: aload_251: ldc           #2                  // String world53: invokevirtual #5                  // Method java/lang/String.equals:(Ljava/lang/Object;)Z56: ifeq          6159: iconst_160: istore_361: iload_362: lookupswitch  { // 20: 881: 99default: 110}88: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;91: ldc           #4                  // String hello93: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V96: goto          11099: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;102: ldc           #2                  // String world104: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V107: goto          110110: return
}

jad

jad是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。还是上面的源代码,使用jad反编译后内容如下:

命令:jad switchDemoString.class

public class switchDemoString
{public switchDemoString(){}public static void main(String args[]){String str = "world";String s;switch((s = str).hashCode()){default:break;case 99162322:if(s.equals("hello"))System.out.println("hello");break;case 113318802:if(s.equals("world"))System.out.println("world");break;}}
}

看,这个代码你肯定看的懂,因为这不就是标准的java的源代码么。这个就很清楚的可以看到原来字符串的switch是通过equals()和hashCode()方法来实现的。

CFR

jad很好用,但是无奈的是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比jad来说,他的语法可能会稍微复杂一些,但是好在他可以work。

如,我们使用cfr对刚刚的代码进行反编译。执行一下命令:

java -jar cfr_0_125.jar switchDemoString.class --decodestringswitch false

得到以下代码

public class switchDemoString {public static void main(String[] arrstring) {String string;String string2 = string = "world";int n = -1;switch (string2.hashCode()) {case 99162322: {if (!string2.equals("hello")) break;n = 0;break;}case 113318802: {if (!string2.equals("world")) break;n = 1;}}switch (n) {case 0: {System.out.println("hello");break;}case 1: {System.out.println("world");break;}}}
}

通过这段代码也能得到字符串的switch是通过equals()和hashCode()方法来实现的结论。

总结

其实我们常用的开发工具(例如:IDEA、Eclipse)都带有反编译功能,写此文章以做记录

Java 编译和反编译相关推荐

  1. java反编译工具_漫话:如何给女朋友解释什么是编译与反编译

    戳蓝字"CSDN云计算"关注我们哦! 来源 | 漫话编程 某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?&quo ...

  2. 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)

    Java Decompiler是Java语言的反编译工具,具体介绍见博客Java Decompiler(Java反编译工具) 1.下载插件 Eclipe的Java Decompiler插件名为JD-E ...

  3. Java——编译与反编译

    ** 一.基础知识 ** 1.1 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级 ...

  4. Java代码的编译与反编译那些事儿

    GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...

  5. Java基础04 编译与反编译

    1. 编译 编译: 把所写的高级语言所写作的源代码程序,转换成计算机能直接识别.执行的低级语言的程序,也就是可执行文件. Java语言的编译: Java语言作为一种高级语言,想要被执行就要通过编译将其 ...

  6. java编译和反编译

    Java开发必会的反编译知识(附支持对Lambda进行反编译的工具) (qq.com)https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid ...

  7. java反编译是什么_什么是Java代码的编译与反编译?

    Java代码的编译与反编译 2017-02-21 Hollis 数盟 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目标程序的动作. 编译就是把高级语言变 ...

  8. java编译与反编译

    文章目录 1.编译和反编译 2.编译有依赖,无法通过 试验一: 2.1.解决方案一: 2.2.解决方案二: 2.3.javac编译之后的class文件 原理 1.编译和反编译 Java的编译分为两个阶 ...

  9. Java 编译与反编译

    编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级语言(Low-level Lang ...

最新文章

  1. linux 常用的系统信息查看命令
  2. hive币2021年预计涨到多少_比特币突破4万美元,比特币2021年会涨到多少?
  3. 计算机网络之网络层:6、IPv6
  4. 向圣诞老人和他的精灵学习Google Analytics(分析)
  5. java 并_java并发编程(一)
  6. Java Architecture [JAVA的架构]
  7. windows7蓝牙怎么打开_避开网络限制,通过蓝牙共享网络连接
  8. cubieboard服务器系统,cubieboard 搭建家用服务器
  9. hibernate使用Query进行查询
  10. 用C语言实现简单的一字棋游戏
  11. 使用echarts生成漂亮的3D地图
  12. 购买太平洋保险公司聚宝盆险发现虚假宣传,没有证据,如何向保监会投诉
  13. 解决屏蔽流氓蜘蛛抓取,如MJ12bot 、DotBot 、BLEXBot 、PetalBot 、DataForSeoBot
  14. 分布式中间件──断路器
  15. 怎样写一个简单的操作系统?
  16. 使用numpy进行9宫格图像拼接
  17. python -猜字小游戏
  18. 软件工程师应具备的素质
  19. 职业道德 技术交流
  20. 盘点为云计算发展做出贡献的十位先驱

热门文章

  1. 自定义注解添加@Target与@Retention
  2. Java pcm/wav文件转mp3(流的方式)
  3. 操作系统——第三章思维导图
  4. 一行python能做什么!
  5. 对话任正非:华为是一家全球化公司
  6. SEO做外链Outreach邮件回复低,怎么办?
  7. 前端面试整理(VUE+JS)
  8. 计算机系统字体安装程序,windows系统字体安装方法:使用字体安装软件-windows技巧-电脑技巧收藏家...
  9. 学术-物理-维空间:五维空间
  10. 6.机器学习sklearn------上证指数涨跌预测