Java基础04 编译与反编译

本文详细介绍了Java的编译过程,包括前端和后端编译,以及编译后的字节码运行原理。同时,讲解了反编译的概念,如何通过工具如javap、jad、CFR和JD-GUI将.class文件反编译回接近源代码的形式。此外,还讨论了防止反编译的策略,如代码混淆和加密。
摘要由CSDN通过智能技术生成

1. 编译

编译: 把所写的高级语言所写作的源代码程序,转换成计算机能直接识别、执行的低级语言的程序,也就是可执行文件。
Java语言的编译: Java语言作为一种高级语言,想要被执行就要通过编译将其转换为机器语言。Java的编译分为两步:
1)前端编译: * . java文件转换为 * .class文件(字节码文件)。Java的前端编译器主要是javac, Eclipse JDT 中的增量式编译器 ECJ 等。
2)后端编译:在经过后端编译器,将class字节码文件,编译成机器语言。Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。
高级语言: 程序员使用。高度封装的编程语言,如Java、c、c++,Python等,计算机无法直接识别,需转换为机器语言。
低级语言: 与高级语言相对,低级指接近电脑底层的编程,主要语言有机器语言和汇编语言。
机器语言: 针对计算机而言。机器能直接识别的程序语言或代码指令,无需经过翻译,每一段操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。
汇编语言: 用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言。不同设备中,编程语言对应不同的机器语言指令集。用一些容易理解和记忆的字母、单词来代替一个特定的指令,如“ADD”表示数字逻辑上的加减,“MOV”表示数据传递等。

2. 反编译

通过编译器,可以把高级语言的源代码编译成低级语言,反之,可以通过低级语言进行反向获取源代码。这个过程即反编译。很难将机器语言反编译成源代码,但是能把中间代码进行反编译,即虽然不能把经过虚拟机编译后的机器语言进行反编译,但是可以把javac编译得到的class进行反编译。Java的反编译,一般是将class文件转换成java文件。
1)反编译作用
学习Java的一种方法。Java中源代码为.java文件,然后经过编译后生成计算机可识别的.class文件,但是.class文件是计算机识别的,因此需要反编译变成程序员能看懂的代码,但是反编译后的代码并不是和源码一模一样,而是非常接近的。并且经过反编译,也可以学习别人的代码。
2)反编译方法
Java文件编译后编程字节码文件(class文件),我们无法看懂,要是想要看懂就需要反编译。反编译的一种简单方法:(使用IDEA)把class文件,拖拽到IntelliJ IDEA工具中,IntelliJ自动进行反编译。
实例:
Java源代码:

public class data {
    public static void main(String[] args) {
        String name = "张三";

        switch(name){
            case "张三":
                System.out.println("张三");
                break;
            case "李四":
                System.out.println("李四");
                break;
            default:
                System.out.println("未知");
        }
 }
}

反编译过程:
点开项目结构,找到如如下红框所示的编译输出路径。打开路径,找到对应class文件。
在这里插入图片描述
选择打开文件,跳到如下含Java文件的文件夹中,将刚刚找到的class文件复制到该文件夹后,点击打开。
在这里插入图片描述

在这里插入图片描述
得到如下反编译之后的文件,通过IDEA。
在这里插入图片描述

Java中有很多反编译工具。
javap: jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap生成的文件并不是java文件,而是class字节码文件。
jad: 只要下载一个执行工具,就可以实现对class文件的反编译了。 可以把class文件反编译成java文件的。jad已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败。
CFR:可代替jad,相比jad来说,语法会稍微复杂一些。
JD-GUI:一个独立的图形实用程序,显示“.class”文件的Java源代码,可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。
3)防止反编译
a. 隔离Java程序,让用户接触不到*.class文件;
b. 对 * . class文件进行加密,增加破解难度;
c. 代码混淆(Obfuscated code)亦称 花指令 ,将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值