2017-03-19 14 views
2

Procyonライブラリのcom.strobel.decompiler.Decompiler逆コンパイラを使用してjarファイルから特定のクラスを逆コンパイルしようとしています。Procyon: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.

。 (これは、型ローダーを設定することによって行われます)。

実際の質問:jarファイルから特定のクラスをprocyonデコンパイラで逆コンパイルするにはどうすればよいですか? (私のアプローチで間違ったことは何ですか?)

Greets、NopMind。

答えて

1

答えは簡単です。クラスネームスペースは.の接頭辞ではなく、代わりに/となります。

Decompiler.decompile("com/myjar/foo", ...)を置き換えるだけで問題ありません。申し訳ありません

0

Procyonをクラス名でより寛容にすることができます。あなたがしなければならないのは、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は最初に、正確にがターゲットメソッドのパラメータタイプと一致しないすべての引数の前にキャストを挿入します。メソッドがオーバーロードを持つ可能性があるため、これらのキャストを削除すると、呼び出しが間違ったメソッドにバインドされる可能性があるため、これを行う必要があります。 しかし、の場合、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や他の場所での依存関係のための機会の探索を行います。

関連する問題