我想要一种简单的方法来反编译Java。我想检查一下javac编译器对我的代码所做的转换和修改。什么是好产品,什么是好/坏。
答案 0 :(得分:5)
快速而又脏,请使用JDK附带的javap
。
javap -c test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2; //String CR_ABC_DEF_GHI
2: astore_1
3: ldc #3; //String TYPE=Eligibility Only|CLIENT_ID=62|EMPLOYER_ID=0|LOCATION_ID=0|PLAN_ID=all|FREQUENCY=52|FILE=null|FILETYPE=C|PROCESSTOLAUNCH=10|PROCESSTOLAUNCHSTATUS=100|SCHEDULE_ID=29837d692f4c43e786f1097fab7c360c
5: astore_2
6: ldc #4; //String \|
8: astore_3
9: ldc #5; //String FILE_NAME_TEMPLATE
11: astore 4
13: ldc #6; //String FILE
15: astore 5
17: new #7; //class java/lang/StringBuilder
20: dup
21: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
24: aload_3
25: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: aload 4
30: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
33: ldc #10; //String =
35: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
38: ldc #11; //String [^
40: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
43: aload_3
44: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
47: ldc #12; //String ]*
49: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
52: aload_3
53: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
56: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
59: astore 6
61: new #7; //class java/lang/StringBuilder
64: dup
65: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
68: aload_3
69: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: aload 5
74: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
77: ldc #10; //String =
79: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
82: ldc #11; //String [^
84: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
87: aload_3
88: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
91: ldc #12; //String ]*
93: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
96: aload_3
97: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
100: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
103: astore 7
105: new #7; //class java/lang/StringBuilder
108: dup
109: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
112: aload_3
113: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
116: aload 4
118: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
121: ldc #10; //String =
123: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
126: aload_1
127: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
130: aload_3
131: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
134: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
137: astore 8
139: aload_2
140: aload 6
142: aload 8
144: invokevirtual #14; //Method java/lang/String.replaceAll:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
147: aload 7
149: aload 8
151: invokevirtual #14; //Method java/lang/String.replaceAll:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
154: astore 9
156: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
159: new #7; //class java/lang/StringBuilder
162: dup
163: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
166: ldc #16; //String before =
168: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
171: aload_2
172: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
175: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
178: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
181: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
184: new #7; //class java/lang/StringBuilder
187: dup
188: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
191: ldc #18; //String pattern1 =
193: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
196: aload 6
198: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
201: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
204: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
207: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
210: new #7; //class java/lang/StringBuilder
213: dup
214: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
217: ldc #19; //String pattern2 =
219: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
222: aload 7
224: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
227: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
230: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
233: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
236: new #7; //class java/lang/StringBuilder
239: dup
240: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
243: ldc #20; //String replace =
245: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
248: aload 8
250: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
253: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
256: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
259: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
262: new #7; //class java/lang/StringBuilder
265: dup
266: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V
269: ldc #21; //String after =
271: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
274: aload 9
276: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
279: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
282: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
285: return
}
答案 1 :(得分:2)
最好的一个可能是jad:
如果您使用Eclipse,则可以使用JadClipse插件,以获得更符合人体工程学的界面:
答案 2 :(得分:1)
我发现this tool非常好。
答案 3 :(得分:1)
另一个java反编译器 - AndroChef Java Decompiler可用:http://www.neshkov.com/ac_decompiler.html
答案 4 :(得分:0)
我使用过JAD,可以测试它的实用性。
虽然任何解编译的代码最有可能没有任何评论,但如果代码被混淆,那么反编译将不会真正让你在任何地方。它仍然看起来像胡言乱语。