디컴파일 과정은 컴파일의 반대입니다. 컴파일된 프로그래밍 언어를 컴파일되지 않은 상태로 복원하는 것, 즉 소스 코드를 알아내는 것입니다. 프로그래밍 언어. 기계가 이해할 수 있는 언어를 프로그래머가 이해할 수 있는 언어로 변환하는 것입니다. Java 언어에서 디컴파일이란 일반적으로 클래스 파일을 Java 파일로 변환하는 것을 의미합니다.
Java 일반 디컴파일 도구
이 글에서는 주로 javap, jad, cfr 4가지 Java 디컴파일 도구와 시각적 디컴파일 도구 JD를 소개합니다. GUI
JAVAP
javap은 코드를 디컴파일하고 Java 컴파일러에서 생성된 바이트코드를 볼 수 있는 도구입니다. javap와 다른 두 디컴파일 도구의 가장 큰 차이점은 생성하는 파일이 Java 파일이 아니며 다른 두 도구에서 생성된 코드만큼 이해하기 쉽지 않다는 것입니다. 예를 들어 간단한 코드를 예로 들면, Java 7의 스위치가 문자열을 지원하는 방식을 분석하려면 먼저 컴파일하고 전달할 수 있는 다음 소스 코드가 있습니다. #🎜 🎜#
public class switchDemoString { public static void main(String[] args) { String str = "world"; switch (str) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: break; } } }생성된 코드는 다음과 같습니다.
javac Decompilation.java javap -c Decompilation.classjavap은 바이트코드를 자바 파일로 디컴파일하지 않고, 우리가 이해할 수 있는 바이트코드를 생성합니다. 실제로 javap에 의해 생성된 파일은 여전히 바이트코드이지만 프로그래머는 이를 좀 더 이해할 수 있습니다. 바이트코드에 대한 지식이 있으면 위 코드를 이해할 수 있습니다. 실제로는 String을 해시코드로 변환한 후 비교하는 것입니다.
JAD
JAD는 실행 도구를 다운로드하기만 하면 클래스 파일을 디컴파일할 수 있습니다. 여전히 위의 소스 코드에서 jad를 사용하여 디컴파일한 후의 내용은 다음과 같습니다.
명령: jad.exe Decompilation.class는 Decompilation.jad 파일을 생성합니다. JAD 디컴파일 결과는 다음과 같습니다.Compiled from "Decompilation.java" public class Decompilation { public Decompilation(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16 // String world 2: astore_1 3: aload_1 4: dup 5: astore_2 6: invokevirtual #18 // Method java/lang/String.hashCode:()I 9: lookupswitch { // 2 99162322: 36 113318802: 48 default: 82 } 36: aload_2 37: ldc #24 // String hello 39: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 42: ifne 60 45: goto 82 48: aload_2 49: ldc #16 // String world 51: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 54: ifne 71 57: goto 82 60: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream; 63: ldc #24 // String hello 65: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 68: goto 82 71: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream; 74: ldc #16 // String world 76: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 79: goto 82 82: return }위 코드를 보시면 표준 자바 소스코드 아닌가요? 이는 원래 문자열 스위치가 equals() 및 hashCode() 메서드를 통해 구현되었음을 명확하게 보여줍니다.
CFR
JAD는 매우 유용하지만 안타깝게도 오랫동안 업데이트되지 않아서 새로운 도구만 사용할 수 있습니다. 이를 대체하려면 CFR이 JAD와 비교했을 때 구문이 약간 더 복잡할 수 있지만 다행히도
CFR은 Java 8 람다(Java 및 이전 버전의 Java beta 103), Java 7 String은 디컴파일되었지만 CFR은 완전히 Java 6으로 작성되었습니다. 디컴파일은 javac Decompilation.java 명령을 통해 수동으로 컴파일하고 생성하는 것이 좋습니다. 성공적인 디컴파일 결과는 다음과 같습니다.// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: Decompilation.java package com.yveshe; import java.io.PrintStream; public class Decompilation { public Decompilation() { } public static void main(String args[]) { String str = "world"; String s; switch((s = str).hashCode()) { default: break; case 99162322: if(s.equals("hello")) System.out.println("hello"); break; case 113318802: if(s.equals("world")) System.out.println("world"); break; } } }Jad에 비해 CFR에는 매개변수가 많아 아직은 그대로인 코드입니다. 다음 명령을 사용하면 출력 결과가 달라집니다.
E:CRF>java -jar cfr_0_125.jar Decompilation.class
/* * Decompiled with CFR 0_125. */ package com.yveshe; import java.io.PrintStream; public class Decompilation { public static void main(String[] args) { String str; String s = str = "world"; switch (s.hashCode()) { default: { break; } case 99162322: { if (!s.equals("hello")) break; System.out.println("hello"); break; } case 113318802: { if (!s.equals("world")) break; System.out.println("world"); } } } }
--decodestringswitch는 스위치의 세부 정보를 디코딩하는 것을 의미합니다. 지원 문자열.
JD-GUI
JD-GUI는 Pavel Kouznetsov가 개발한 C++로 개발된 Java 역컴파일 도구이며 Windows 및 Linux를 지원합니다. Apple Mac Os의 세 가지 플랫폼. 그리고 Eclipse 플랫폼에서 JD-Eclipse 플러그인을 제공합니다. JD-GUI는 GPLv3 오픈 소스 라이센스를 기반으로 하며 개인 용도로는 완전 무료입니다. JD-GUI의 가장 중요한 점은 파일을 창에 직접 끌어서 놓을 수 있다는 것입니다.
# 🎜🎜#JadClipse#🎜 🎜#
Jad 플러그인은 Jd 플러그인이 아닌 여기에 설치된다는 점 참고하세요~#🎜🎜 #필수 리소스: net.sf.jadclipse_3.3.0.jar 플러그인 jar 및 JAD.exe 디컴파일 소프트웨어(다운로드 주소는 기사 끝 부분에 있음) JadClipse 다운로드 주소 플러그인 jar 다운로드 공식 웹사이트에서 패키지를 다운로드한 다음 eclipse의 플러그인 디렉토리에 jar 패키지를 배치합니다. Eclipse, Eclipse->Window->Preferences->Java를 열면 이때 JadClipse 옵션이 하나 더 있음을 알 수 있습니다. 이전보다 아래와 같이 JadClipse를 구성할 수 있습니다.
기본 구성이 완료된 후, 클래스 파일의 기본 열기 방법을 설정합니다:
Eclipse->Window->Preferences- >General->Editors->File Associations 클래스를 여는 방법에는 두 가지가 있음을 알 수 있습니다. 여기에서는 JadClipse와 Eclipse와 함께 제공되는 Class File Viewer를 설정하며 JadClipse가 기본값입니다.이제 소스 코드를 볼 수 있습니다. 보고 싶은 클래스를 선택하고 F3을 눌러 소스 코드를 확인하세요. JadClipse가 기본 설정이 아닌 경우에는
# 🎜🎜#자바에 대한 자세한 내용은java기본 튜토리얼
열을 참고하세요.위 내용은 자바를 디컴파일하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!