Java를 디 컴파일하는 간단한 방법을 원합니다. javac 컴파일러가 내 코드에서 수행하는 변환과 수정을 검사하고 싶습니다. 어떤 좋은 제품이 될 것이며 그 제품의 좋고 나쁨은 무엇이겠습니까?Java 디 컴파일 방법
3
A
답변
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 아마도 : 이클립스를 사용하는 경우
, 좀 더 인체 공학적인 인터페이스를 들어, JadClipse 플러그인을 사용할 수 있습니다
1
나는 발견했다 this tool 꽤 좋습니다.
0
나는 JAD를 사용해 왔으며 유용성을 느낄 수 있습니다.
비록 컴파일 된 코드가 주석이 없을 가능성이 높습니다. 코드가 난독 화되면 디 컴파일이 실제로 어디에도 나타나지 않습니다. 그것은 여전히 변태처럼 보일 것입니다.
1
다른 Java decompiler - AndroChef Java Decompiler를 사용할 수 있습니다. http://www.neshkov.com/ac_decompiler.html
관련 문제
- 1. JVM 언어 디 컴파일
- 2. 디 컴파일 후 Java 파일에 바이트 코드
- 3. Java JIT 컴파일 원시 바이트 코드 디 컴파일
- 4. 이전 프로그램 디 컴파일
- 5. 엑세스 추출 (디 컴파일)
- 6. DLL 디 컴파일
- 7. Java 디 컴파일러
- 8. ms 액세스에서 디 컴파일/재 컴파일 자동화
- 9. swf 파일 디 컴파일 프로그램
- 10. .NET 2.0 바이너리 디 컴파일
- 11. .exe MATLAB 파일 디 컴파일
- 12. JD-GUI로 Java 파일을 일괄 디 컴파일 (decompiling)
- 13. 라인 번호 속성이없는 Java 디버깅 디 컴파일 된 클래스
- 14. 자바 디 컴파일 출력의 레이블 위치
- 15. 디 컴파일 아이폰 OS 오브젝티브 C 바이너리
- 16. 미국에서 작성된 Java 디 컴파일러
- 17. ARM asm을 C로 다시 디 컴파일
- 18. 디 컴파일 된 자바에서 this = this
- 19. 이상한 디 컴파일 코드는 제네릭 클래스
- 20. IROM 코드를 고수준 코드로 디 컴파일
- 21. 디 컴파일 후 일부 구문 문제
- 22. dotnet dll 디 컴파일 및 코드 변경
- 23. 솔라리스에서 타사 공유 라이브러리 디 컴파일
- 24. microsoft agent 디 컴파일/압축 해제 하시겠습니까?
- 25. 안드로이드 키 저장, 두려움 디 컴파일
- 26. ActionScript 코드 디 컴파일 (decompilaton)을 방지하는 방법
- 27. 디 컴파일러로부터 Java 코드를 보호하는 방법은 무엇입니까?
- 28. * .Jar로 다시 컴파일 코드를 디 컴파일하고 수정 한 후?
- 29. 내 apk가 디 컴파일되지 않게하는 방법
- 30. Jar 파일을 디 컴파일하지 않음
시작 지점이 많습니까? http://stackoverflow.com/search?q=decompiler+java – birryree
컴파일러 **는 ** 귀하의 코드를 수정하지 않으며, 귀하의 코드를 자바 바이트 코드 ('.class' 파일에 저장 됨)로 변환합니다. –
컴파일러가 최적화를 거의하지 않으며 JVM이 런타임에 수행 할 작업에 대해 많은 정보를주지 않는다는 점에 유의하십시오. JVM에서는 모든 중요한 최적화가 이루어집니다. –