Java 编译和反编译

编程语言

编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language)。

低级语言: 机器语言(Machine Language)和汇编语言(Assembly Language),直接用计算机指令编写程序。
高级语言: C、C++、Java、Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

编译

将便于人编写、阅读、维护的高级计算机语言所写成的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序的过程就是编译。负责这一过程的处理的工具叫做编译器。Java语言中负责编译的编译器是一个命令:javac 。

javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

反编译

反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。

Java常用反编译工具

JAVAP

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

javap并没有将字节码反编译成java文件,而是生成了一种我们可以看得懂字节码。其实javap生成的文件仍然是字节码,只是程序员可以稍微看得懂一些。如果你对字节码有所掌握,还是可以看得懂。其实就是把String转成hashcode,然后进行比较。

JAD

JAD是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译。 由于已经很久未更新,反编译java8时会出现编译失败,比如lambda表达式。

命令:jad.exe xxx.class 会生成一个xxx.jad的文件

CFR

CFR是一个不错的选择,相比JAD来说,他的语法可能会稍微复杂一些,但是好在他可以用。

java -jar cfr_0_110.jar xxxx.class --decodestringswitch false 

--decodestringswitch 表示对于switch支持string的细节进行解码
--decodelambdas 对lambda表达式进行反编译。

JD-GUI

JD-GUI 是一个用 C++ 开发的 Java反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI 基于GPLv3开源协议,对个人使用是完全免费的。JD-GUI主要的是提供了可视化操作,直接拖拽文件到窗口既可,效果图如下:


image.png
如何防止反编译

提供几种思路:
● 隔离Java程序
● 对Class文件进行加密
● 对代码进行混淆

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java的编译和反编译 什么是编译 编译就是把C、C++、Java等高级语言转换成汇编语言、机器语言等低级语言的过...
    人在码途阅读 6,036评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,831评论 25 709
  • 编译 编程语言有高级和低级之分。所谓低级语言就是指可以被计算机理解并执行的语言,例如机器语言。而高级语言计算...
    still_loving阅读 1,785评论 0 4
  • 你,是上天派在我身边的天使 每周约定 不论风雨 诉衷肠 不约而同的撞衫 每天的呼叫 已经成为彼此生命中重要的一部分...
  • 沉鱼浣纱鱼忘游, 落雁和亲雁悲留。 闭月浮云遮明月, 羞花落泪叶卷球。
    姜德馨阅读 196评论 0 0