Java 编译和反编译
什么是编译
编译:
- 将高级语言翻译成汇编语言或机器语言的过程 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 编译和反编译相关推荐
- java反编译工具_漫话:如何给女朋友解释什么是编译与反编译
戳蓝字"CSDN云计算"关注我们哦! 来源 | 漫话编程 某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?&quo ...
- 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)
Java Decompiler是Java语言的反编译工具,具体介绍见博客Java Decompiler(Java反编译工具) 1.下载插件 Eclipe的Java Decompiler插件名为JD-E ...
- Java——编译与反编译
** 一.基础知识 ** 1.1 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级 ...
- Java代码的编译与反编译那些事儿
GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...
- Java基础04 编译与反编译
1. 编译 编译: 把所写的高级语言所写作的源代码程序,转换成计算机能直接识别.执行的低级语言的程序,也就是可执行文件. Java语言的编译: Java语言作为一种高级语言,想要被执行就要通过编译将其 ...
- java编译和反编译
Java开发必会的反编译知识(附支持对Lambda进行反编译的工具) (qq.com)https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid ...
- java反编译是什么_什么是Java代码的编译与反编译?
Java代码的编译与反编译 2017-02-21 Hollis 数盟 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目标程序的动作. 编译就是把高级语言变 ...
- java编译与反编译
文章目录 1.编译和反编译 2.编译有依赖,无法通过 试验一: 2.1.解决方案一: 2.2.解决方案二: 2.3.javac编译之后的class文件 原理 1.编译和反编译 Java的编译分为两个阶 ...
- Java 编译与反编译
编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级语言(Low-level Lang ...
最新文章
- Java的类,对象以及字段和方法
- 【数据分析】用于数据分析的8个SQL技术
- 微信v3app支付php,php微信支付之APP支付方法_php技巧
- java match正则不生效_[Java教程]正则表达式match()函数
- mysql第五章上机事务_算法第五章上机实践
- Map-Reduce的逻辑过程
- lzw压缩 java_java实现的LZW 压缩算法源码 | 学步园
- android aop 权限检查,AOP简单拦截实现验证权限功能
- 打开stl文件_介绍一种修复、查看以及打印STL三维模型文件的工具
- 8-12 三个定时任务
- Java虚拟机知识点【栈帧】
- NLP中Tokenizers总结(BPE、WordPiece、Unigram和SentencePiece)
- Leetcode:799. 香槟塔
- IE浏览器打不开解决办法
- Premiere Pro CC 2018 经典教程
- c语言坦克大战程序设计,C语言坦克大战源码分析
- 文件不见还占用空间咋修复
- 走马灯如何实现图片自适应
- ssi 指令 php,SSI使用详解(一)_PHP教程
- 快客脚本引流工作室:每天用脚本快速引流几千上万到底是啥回事。