사람이 읽을 수있는 방식으로 Java .class 파일을 열려면 어떻게해야합니까?


111

Java 애플릿의 클래스 파일이 내부에서 수행하는 작업을 파악하려고합니다. 메모장이나 Textpad로 열면 엉뚱한 멍청이가 나타납니다.

내가 무엇을하는지 알아낼 수 있도록 다소 읽기 쉬운 형식으로 다시 엉키는 방법이 있습니까?

  • 환경 == VS 2008이 설치된 Windows.

7
의미론적인 것입니다. 하나 = 둘이 아니어야하지 않습니까? ==는 질문이고 =는 진술이며 환경에 대한 진술을하고 있습니다.
icco

이 질문을 명확히 할 수 있습니까? 내 즉각적인 생각은 실제 바이트 코드를 읽고 싶었지만 실제로 다른 사람의 코드를 디 컴파일하고 싶은 것 같습니다.
Outlaw Programmer

12
@icco, =는 할당을 의미하고 ==는 평등을 의미합니다. 그는 (Environment == Windows w / VS2008 설치)가 사실이며, 환경을 VS2008이 설치된 Windows로 설정하라는 명령을 내리지 않았습니다. 주제에서 벗어난 괴상한 남자.
Blorgbeard는

7
레코드를 위해 ==는 동등성을 선언하지 않습니다. 평등을 테스트합니다. true == false라고 쓸 수 있으며, 이는 Environment == Windows w / VS 2008이 설치된 것만 큼 의미가 있습니다. 즉, 전혀 의미가 없습니다.
bwerks

답변:


208

jd-gui 는 현재 최고의 디 컴파일러입니다. 점점 더 많은 JAD에 비해 Java의 새로운 기능을 처리 할 수 ​​있습니다.


1
이 답변은 2020 년에 얼마나 최신입니까?
The Coding Wombat

링크가 어딘가로가는 한 괜찮다고 생각합니다. 오래 전부터 Java를 사용하지 않았기 때문에 이제 더 나은 Java 디 컴파일러가 있는지 알 수 없습니다.
DarenW

77

바이트 코드를 읽는 데 신경 쓰지 않는다면 javap가 잘 작동합니다. 표준 JDK 설치의 일부입니다.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

9

@MichaelMyers가 지적했듯이

javap -c <name of java class file> 

JVM 어셈블리 코드를 얻으려면. 더 나은 가시성을 위해 출력을 텍스트 파일로 리디렉션 할 수도 있습니다.

javap -c <name of java class file> > decompiled.txt

7

자바 디 컴파일러를 원하면 명령 줄 도구 javap를 사용하여이를 수행 할 수 있습니다 . 또한 Java Decompiler HOW-TO 는 클래스 파일을 디 컴파일하는 방법을 설명합니다.


2

당신이 찾고있는 것은 자바 디 컴파일러입니다. 나는 JAD http://www.kpdus.com/jad.html을 추천한다 . 그것은 비 상업적 사용을 위해 무료이며 작업을 완료한다.

참고 : 이것은 작성된 코드와 똑같은 코드를 만들지는 않습니다. 즉, 주석과 변수 이름을 잃어 버릴 것이므로 일반 소스 코드를 읽는 것보다 조금 더 어려울 것입니다. 개발자가 정말로 비밀 스럽다면 코드도 난독 화하여 읽기가 더 어려워 질 것입니다.


2

cpuguru, 애플릿이 javac 1.3 이하로 컴파일 된 경우 가장 좋은 옵션은 Jad를 사용하는 것입니다.

안타깝게도 JAD 1.5.8 (2001 년 4 월 14 일)에서 지원하는 마지막 JDK는 JDK 1.3입니다.

애플릿이 최신 컴파일러로 컴파일 된 경우 JD-GUI를 사용해 볼 수 있습니다. .이 디 컴파일러는 개발 중이지만 JDK 1.4, 1.5 또는 1.6으로 컴파일 된 클래스에 대해 대부분의 경우 올바른 Java 소스를 생성합니다.

DarenW, 귀하의 게시물에 감사드립니다. JD-GUI는 아직 최고의 디 컴파일러는 아니지만 ... 작업 중입니다. :)



2

Jad 를 사용 하여 디 컴파일하는 것이 아마도 최선의 선택 일 것입니다. 코드가 난독 화되지 않은 경우 괜찮은 결과를 생성합니다.



1

디 컴파일러를 사용해야합니다. 다른 사람들은 JAD를 제안했고 다른 옵션이 있으며 JAD가 최고입니다.

원본 소스 코드에 비해 약간 잃어 버릴 수있는 의견을 반영하겠습니다. 삭제로 인해 코드가 제네릭을 사용하면 특히 재미있어 보일 것입니다.



1

확인하려는 클래스 파일이 오픈 소스 인 경우 디 컴파일하지 말고 소스 파일을 IDE에 직접 첨부해야합니다. 이렇게하면 라이브러리 클래스의 코드를 마치 자신의 것처럼 볼 수 있습니다.


0

제안 된대로 JAD를 사용하여 디 컴파일하고 파일을 볼 수 있습니다. 쉽게 읽을 수 있도록 이클립스 용 JADclipse 플러그인을 사용하여 JAD를 이클립스에 직접 통합하거나 명령 줄 JAD보다 훨씬 사용하기 쉬운 DJ Java Decompiler를 사용할 수 있습니다.


0

결과적으로 읽을 수있는 Java 코드를 원하는 경우 JAD는 훌륭한 옵션입니다. 그래도 .class파일 형식 의 내부를 파헤 치고 싶다면 javap. JDK와 함께 번들로 제공되며 16 진수 바이트 코드를 읽을 수있는 ASCII로 "디 컴파일"할 수 있습니다. 그것이 생성하는 언어는 여전히 바이트 코드 (Java와 같은 것은 아님)이지만 상당히 읽기 쉽고 매우 유익합니다.

또한 정말로 원한다면.class 16 진 편집기에서 파일을 바이트 코드를 직접 읽을 수 있습니다. 결과는를 사용하는 것과 동일합니다 javap.


0

Applet.class를 디 컴파일 할 필요가 없습니다. 공용 Java API 클래스 소스 코드는 JDK (설치하기로 선택한 경우)와 함께 제공되며 디 컴파일 된 바이트 코드보다 더 읽기 쉽습니다. src.zip (JDK 설치 폴더에 있음)에서 압축 된 파일을 찾을 수 있습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.