2017-03-19 5 views
2

Procyon 라이브러리의 com.strobel.decompiler.Decompiler 디 컴파일러를 사용하여 jar 파일에서 특정 클래스를 디 컴파일하려고합니다.프로 시온 : 특정 항아리 클래스 디 컴파일

이 내 현재의 접근 방식 :

// jar file containing foo.class and bar.class 
JarFile myJar = new JarFile("my.jar"); 
// creating decompiler settings 
DecompilerSettings settings = new DecompilerSettings(); 
// set type loader to jar file 
settings.setTypeLoader(new JarTypeLoader(myJar)); 

StringWriter foo = new StringWriter(); 
Decompiler.decompile("com.myjar.foo", new PlainTextOutput(foo), settings); 
System.out.print(foo.toString()); 

그러나 이것은 단지 인쇄하지 : 나는 클래스 로딩 my.jar에서 클래스에 대한 뭔가를 놓친 확신 !!! ERROR: Failed to load class com.myjar.foo.

. (이것은 타입 로더를 설정함으로써 이루어질 것이라고 생각했다.)

실제 질문 : 어떻게 procyon decompiler 함께 jar 파일에서 특정 클래스를 디 컴파일합니까? (내 접근 방식에서 내가 뭘 잘못 했니?)

Greets, NopMind.

답변

1

대답은 간단합니다. 클래스 네임 스페이스 앞에 .이 붙지 않고 그 대신 /이 붙습니다.

따라서 Decompiler.decompile("com/myjar/foo", ...)을 바꾸는 것이 좋습니다. 죄송합니다.

0

프로 시온을 클래스 이름에 대해 더 관대해질 수 있습니다. InputTypeLoader에 '기본'유형 로더를 넣기 만하면됩니다.

settings.setTypeLoader(new InputTypeLoader(new JarTypeLoader(myJar))); 

InputTypeLoader 먼저 기본 유형 로더를 사용하여 클래스를 찾으려고하며, 일치하는 항목을 찾을 수없는 경우, 그것은 '마사지'클래스 이름으로 노력할 것입니다. 사용자가 / 또는 $ 대신 .과 같은 대체 양식을 사용하려고하는 명령 줄 디 컴파일러에서 사용됩니다. 예를 들어 클래스 com/jar/Foo이 있고 사용자가 com.jar.Foo의 디 컴파일을 시도하면이를 해결할 수 있어야합니다. 내부 클래스에서도 작동해야합니다 (예 : com.jar.Foo.Bar) com/jar/Foo$Bar을 찾을 수 있습니다. 이 기능을 사용할지 여부는 사용자의 몫입니다.

는 그래도 난, 당신을 위해 추천을 수행 당신은 아마 JarTypeLoader 같은 형 로더를 사용하고 싶지 않아요. 그렇게하면 Procyon은 에만 특정 항아리 안에있는 클래스를 검색합니다. 그게 소리가일지도 모르지만, 아마 그렇지 않을 수도 있습니다.

프로 시온이 클래스의 종속성을 분석하고 분석 할 수있을 때만 수행 할 수있는 최적화가 있습니다. 예를 들어, 메서드 호출을 디 컴파일하면 Procyon은 이 정확히이 아닌 모든 인수 앞에 대상 메서드의 매개 변수 유형과 일치하는 캐스트를 삽입합니다. 메서드가 오버로드를 가질 수 있기 때문에 정확성을 위해이 작업을 수행해야하며 이러한 캐스트를 제거하면 호출이 잘못된 메서드에 바인딩 될 수 있습니다. 그러나 Procyon이 메서드 을 선언 한 클래스를 찾을 수 있으면 모든 상위 클래스를 찾을 수 있으므로 올바른 메서드에 바인딩하는 동안 안전하게 제거 할 수있는 캐스트를 파악할 수 있습니다. 그런 다음 중복 된 캐스트를 제거하므로보다 깨끗한 결과를 얻을 수 있습니다. 그것은 하나의 예입니다. 다른 것들도 있습니다.

settings.setTypeLoader(
    new InputTypeLoader(    // allow more relaxed type names 
     new CompositeTypeLoader(
      new JarTypeLoader(myJar), // search your specific jar first 
      new ClasspathTypeLoader() // fall back to your classpath 
     ) 
    ) 
); 

이 프로키온에게 그 클래스 패스에 될 일이 다른 곳 JRE의 종속성과 기회 검색을 줄 것이다 : 여기

내가 사용하는 것이 좋습니다 줄 것입니다.