什么是编译

编译:

  • 将高级语言翻译成汇编语言或机器语言的过程 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. Java的类,对象以及字段和方法
  2. 【数据分析】用于数据分析的8个SQL技术
  3. 微信v3app支付php,php微信支付之APP支付方法_php技巧
  4. java match正则不生效_[Java教程]正则表达式match()函数
  5. mysql第五章上机事务_算法第五章上机实践
  6. Map-Reduce的逻辑过程
  7. lzw压缩 java_java实现的LZW 压缩算法源码 | 学步园
  8. android aop 权限检查,AOP简单拦截实现验证权限功能
  9. 打开stl文件_介绍一种修复、查看以及打印STL三维模型文件的工具
  10. 8-12 三个定时任务
  11. Java虚拟机知识点【栈帧】
  12. NLP中Tokenizers总结(BPE、WordPiece、Unigram和SentencePiece)
  13. Leetcode:799. 香槟塔
  14. IE浏览器打不开解决办法
  15. Premiere Pro CC 2018 经典教程
  16. c语言坦克大战程序设计,C语言坦克大战源码分析
  17. 文件不见还占用空间咋修复
  18. 走马灯如何实现图片自适应
  19. ssi 指令 php,SSI使用详解(一)_PHP教程
  20. 快客脚本引流工作室:每天用脚本快速引流几千上万到底是啥回事。

热门文章

  1. java 椭圆拟合,OpenCV画轮廓的外界圆矩形椭圆等
  2. 基于H5 小程序 UI框架选型 2020年9月10号
  3. 复杂问题(大型系统)的对象模型通常由哪几个层次组成
  4. PS4 + ESP32 制作无线遥控器
  5. hw3-空间与运动作业
  6. NFC是什么 Android手机上的NFC都能做什么
  7. [转载] 发烧了,退烧药该怎么吃?
  8. 全景影像多层级瓦片生成
  9. oracle 分词函数,Oracle 汉语言分词
  10. 一行python能做什么!