>Java >Java베이스 >자바를 디컴파일하는 방법

자바를 디컴파일하는 방법

尚
원래의
2019-12-07 15:06:078900검색

자바를 디컴파일하는 방법

디컴파일 과정은 컴파일의 반대입니다. 컴파일된 프로그래밍 언어를 컴파일되지 않은 상태로 복원하는 것, 즉 소스 코드를 알아내는 것입니다. 프로그래밍 언어. 기계가 이해할 수 있는 언어를 프로그래머가 이해할 수 있는 언어로 변환하는 것입니다. 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.class

javap은 바이트코드를 자바 파일로 디컴파일하지 않고, 우리가 이해할 수 있는 바이트코드를 생성합니다. 실제로 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는 스위치의 세부 정보를 디코딩하는 것을 의미합니다. 지원 문자열.

비슷한 것에는 --decodeenumswitch, --decodefinally, --decodelambdas 등이 있습니다.

--decodelambdas는 람다 표현식을 디컴파일할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.