反编译

先了解一下什么是编译,编译就是将源代码文件转换为二进制文件的过程,即将.java文件编译成.class文件。

这里可以扩展一下,C语言是编译执行的没有争议。java之所以有跨平台性是因为JVM将.class二进制文件解释成机器码,所以有一个误区说java是解释执行的。这在JDK8之前可以这么说,但是JDK8之后JVM中除了解释器还内置了JIT编译器,即动态编译器,它可以以方法为单位,将热点源代码直接编译成机器码,而且下次再用的时候也不需要重新编译了。JIT有一个预热的过程,不会一上来就编译热点代码的,这个很好理解,不预热怎么知道哪些是热点代码呢。所以JDK8之后java是解释执行和编译执行的混合模式。

了解了什么是编译,反编译就很明显了。反编译就是将二进制文件转换为源代码文件,即将.class文件反编译成.java文件。

有几点需要注意的地方,java语法中有很多语法糖,比如for循环,匿名内部类,try-with-resource机制等反编译后会现出最初的样子。

还有一个值得注意的是,java有编译优化算法,比如int i = 1=1;会被优化成int i = 2;。这部分代码的二进制文件被反编译后只能为int i = 2;,即只能反编译为优化后的源码。

有一个有关系统安全性值得思考的地方,既然二进制文件可以被高效的反编译,那系统岂不是很不安全,有这方面的影响,可以采用代码混淆等技术加大反编译难度,不过完全避免反编译不太可能。

至于反编译的原理了解就行,像.net以及java这种基于虚拟机解释才能执行的语言,它们被编译后的.class文件都是采用了Byte Code的二进制结构,而Byte Code很容易被转化成"抽象语法树",即AST,反编译的原理就是利用工具将AST转换为源码。

为什么需要反编译呢,可以用来查看项目中的jar包源码,因为jar包本质上就是被编译后的.class文件。其实在一些IDE工具上可以直接看jar包源码,这是因为IDE工具帮你反编译好了。

反编译工具很多,最常用最高效的是JD-GUI,可以了解一下如何使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值