2011-10-24 4 views
8

나는이 질문을 이미 시간이 gzillions 물었다는 것을 알고 있지만, 나는 enums corrently 처리 할 디 컴파일러 후 구체적으로 오전 왜냐하면 디 컴파일 난 enums를 사용하고 있기 때문에 무겁게). 나는 JAD와 JD-GUI가 모두 테스트하지 않았다.자바 5 (다른 새로운 것들 중에서 열거 형을 처리) 자바 decompiler

누군가가 디 컴파일러를 추천 할 수 있습니까 (이상적으로는 Linux에서 작동하고 쉘 스크립트를 작성하지 않고도 전체 항아리를 쉽게 처리 할 수 ​​있습니까)?

편집 : 그들은 같은 무언가로 (JAD와 JD-GUI 모두) 디 컴파일받을

switch(myEnum) { 
case A: ... 
case B: ... 
} 

:

switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) { 
case 1: 
case 2: 
} 

$SWITCH_TABLE$com$MyType()이 중 하나없는 곳 특히 내가 좋아하는 구조에 문제가 선언되거나 전혀 컴파일되지 않습니다.

+0

[Java 디 컴파일러를 어디에서 찾을 수 있습니까?] (http://stackoverflow.com/questions/671394/where-can-i-find-a-java-decompiler) –

+1

질문에 따라 http://java.decompiler.free.fr/은 Java 5에 가장 적합한 것을 제공합니다.이 방법이 도움이되지 않으면, * 도움이되지 않는 방법을 알려주십시오. –

+0

JD-GUI에 대해서는 잘 모릅니다 만, JD-GUI가하는 구버전의 JD-Core를 사용하는 JD-Eclipse를 사용하고 있으며, 열거 형도 처리하고 있습니다. – Thomas

답변

2

enum 스위치를 올바르게 디 컴파일 할 수 없습니다. Java 클래스 파일은 컴파일 후 enum-Typ에 대해 알지 못하므로 디 컴파일러는 원하는대로 디 컴파일 할 수 없습니다.

Enums-Types는 모두 java.lang.Enum의 하위 유형이며 모든 열거 형 상수에는 switch 문에 사용되는 서수가 있습니다. 컴파일러는 그 int 값에 대한 스위치를 수행합니다. enum 유형에 대한 스위치는 단순히 구문 설탕이라고합니다. null -enum을 켜려고하면 NPE가 표시됩니다.

+0

디 컴파일러가 얼마나 똑똑한가에 따라 달라집니다. 열거 형의 선언을 찾을 수 있으면 서수를 다시 이름으로 매핑 할 수 있어야합니다. – Grzenio

+0

$ 1 버전의 ENUM을 켜는 클래스 파일을 디 컴파일하면 ENUM 상수와 함께 모든 서수 목록을 얻습니다. 이것을 디 컴파일 할 수 있습니다 - 코딩 만하면됩니다. 불행히도 JD-Java Decompiler가 오픈 소스 인 것 같지 않습니다 .- 그리고 JAD는 너무 오래되어 큰 노력 없이는 다른 모든 것에 속도를 낼 수 없습니다. – mjaggard

2

연구 프로젝트의 제품인 CFR은 열거 형을 특히 ​​잘 처리한다는 것을 발견했습니다.

현재 OP의 질문이 게시 된 시점보다 JD-GUI 및 JAD가 더 뛰어나다. CFR 버전 0.43은 난독 화 된 클래스를 제공 받았을 때에도 정확하고 컴파일 가능한 소스를 생성합니다.