java编译和反编译,java 反编译器
如何解决写爬虫IP受阻的问题?立即使用。
反编译的过程正好和编译相反,就是把编译好的编程语言恢复到未编译的状态,也就是找出编程语言的源代码。就是把机器能理解的语言转换成程序员能理解的语言。java语言中的反编译一般是指将类文件转换成Java文件。
Java常用反编译工具
本文主要介绍四种Java反编译工具:javap、jad和cfr,以及可视化反编译工具JD-GUI。
JAVAP
Javap是jdk附带的一个工具。它可以反编译代码或者查看java编译器生成的字节码。java和其他两个反编译工具最大的区别就是Java生成的文件不是Java文件,不像其他两个工具生成的代码那么容易理解。以一段简单的代码为例。例如,如果我们想分析Java 7中的switch是如何支持String的,我们首先有以下可以编译和传递的源代码:
公共类switchDemoString {
公共静态void main(String[] args) {
String str= world
开关(字符串){
case hello :
system . out . println( hello );
打破;
案例“世界”:
system . out . println( world );
打破;
默认值:
打破;
}
}
}执行以下两个命令:
贾瓦茨Decompilation.java
javap -c Decompilation.class生成的代码如下:
从“Decompilation.java”编译
公共类反编译{
公共反编译();
代码:
0: aload_0
1: invokespecial #8 //方法java/lang/Object。init:()V
4:退货
公共静态void main(Java . lang . string[]);
代码:
0: ldc #16 //字符串世界
2:故事1
3: aload_1
4: dup
5:阿斯托雷_2
6: invokevirtual #18 //方法java/lang/String.hashCode:()I
9: lookupswitch { //2
99162322: 36
113318802: 48
默认值:82
}
36: aload_2
37: ldc #24 //String你好
39: invokevirtual #26 //方法Java/lang/string . equals:(Ljava/lang/Object;)Z
42: ifne 60
45:转到82
48: aload_2
49: ldc #16 //弦乐世界
51: invokevirtual #26 //方法Java/lang/string . equals:(Ljava/lang/Object;)Z
54: ifne 71
57:转到82
60:get static # 30//Field Java/lang/system . out:Ljava/io/PrintStream;
63: ldc #24 //String hello
65: invokevirtual #36 //方法Java/io/printstream . println:(Ljava/lang/String;)V
68:转到82
71:get static # 30//Field Java/lang/system . out:Ljava/io/PrintStream;
74: ldc #16 //弦乐世界
76: invokevirtual #36 //方法Java/io/printstream . println:(Ljava/lang/String;)V
79:转到82
82:返回
}javap没有把字节码反编译成java文件,而是生成了一个我们能理解的字节码。其实javap生成的文件还是字节码,只是程序员稍微能看懂一点。如果你对字节码有一定的了解,还是可以理解上面的代码的。其实就是把String转换成hashcode,然后进行比较。
JAD
JAD是一个很好的反编译工具。你可以通过下载一个执行工具来反编译类文件。还是上面的源代码。用jad反编译后,内容如下:
命令:jad.exe decompilation . class将生成一个Decompilation.jad文件
JAD反编译的结果如下:
//由Jad v1.5.8g反编译,版权所有2001 Pavel Kouznetsov。
//Jad主页:http://www.kpdus.com/jad.html
//反编译器选项:packimports(3)
//源文件名:Decompilation.java
package com.yveshe
导入Java . io . printstream;
公共类反编译
{
公共反编译()
{
}
公共静态void main(String args[])
{
String str= world
字符串s;
开关((s=str)。hashCode())
{
默认值:
打破;
案例99162322:
if(s.equals(hello ))
system . out . println( hello );
打破;
案例113318802:
if(s.equals(world ))
system . out . println( world );
打破;
}
}
}看看上面的代码。这不就是标准的java源代码吗?可以清楚的看到,原字符串的切换是通过equals()和hashCode()方法实现的。
CFR
JAD很好用,可惜很久没更新了,只能换个新工具了。CFR是个不错的选择。和JAD相比,他的语法可能稍微复杂一点,不过还好,他会用。
现代的Java特性——Java 8 lambdas(Java和早期版本的Java beta 103)会被CFR反编译,Java 7 String已经反编译,但是CFR完全是用Java 6写的。
建议您通过JavaC Decompilation.java命令手动编译生成Decompilation.class文件,然后进行测试。
的成功反编译结果如下:
/*
*用CFR 0_125反编译。
*/
package com.yveshe
导入Java . io . printstream;
公共类反编译{
公共静态void main(String[] args) {
字符串str
String s=str= world
switch (s.hashCode()) {
默认值:{
打破;
}
案例99162322: {
如果(!s . equals( hello ))break;
system . out . println( hello );
打破;
}
案例113318802: {
如果(!s . equals( world ))break;
system . out . println( world );
}
}
}
}和Jad相比,CFR的参数很多,而且只是代码。如果我们使用以下命令,输出结果将会不同:
E:\CRFjava -jar cfr_0_125.jar反编译. class
/*
*用CFR 0_125反编译。
*/
package com.yveshe
导入Java . io . printstream;
公共类反编译{
公共静态void main(String[] args) {
字符串str
String s=str= world
switch (s.hashCode()) {
默认值:{
打破;
}
案例99162322: {
如果(!s . equals( hello ))break;
system . out . println( hello );
打破;
}
案例113318802: {
如果(!s . equals( world ))break;
system . out . println( world );
}
}
}
}-DecoderStringswitch表示解码交换机支持字符串的细节。
类似的还有- decodeenumswitch,-decodefinedly,- decodelambdas等。
- decodelambdas可以反编译lambda表达式。
JD-GUI
JD-GUI是用C开发的Java反编译工具,由Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os。并提供了Eclipse平台下的插件JD-Eclipse。JD-GUI基于GPLv3开源协议,个人使用完全免费。JD-GUI主要提供可视化操作,你可以直接拖拽文件到窗口。效果图如下
JadClipse
在Eclipse中安装Jad插件。注意这里装的是Jad插件,不是Jd插件~
所需资源:net.sf.jadclipse_3.3.0.jar插件jar和JAD.exe反编译软件(文末有下载地址)。
JadClipse下载地址在官网下载插件的jar包,然后把jar包放到eclipse的plugins目录下;打开Eclipse,Eclipse-窗口-首选项-Java。这个时候你会发现JadClipse比以前多了一个选项。如下图所示配置JadClipse:
基本配置完成后,我们可以设置类文件的默认打开方式:
eclipse-Window-Preferences-General-Editors-File Associations我们可以看到打开类文件有两种方式。这里设置了JadClipse和Eclipse自己的类文件查看器,默认设置为JadClipse。
配置完成。现在我们可以查看源代码,选择要查看的类,按F3查看源代码。如果JadClipse不是缺省设置,可以将其设置为缺省设置。
更多java知识,请关注java基础课程专栏。这就是java反编译的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。