web-dev-qa-db-ja.com

jarファイルからメソッドシグネチャを取得する方法は?

APIの一部のみのjavadocsに付属するサードパーティのjarファイルがあります。 jarファイルをリバースエンジニアリングして、クラスとメソッドの完全なリストを取得する方法はありますか?

45
MCS

_jar tf_ は、コンテンツを一覧表示します。 javap を使用すると、クラスの詳細を表示できます(ツールガイドを参照)。

たとえば、_mypkg.HelloWorld_という名前のクラスがjar _myjar.jar_にある場合、次のように実行します

_javap -classpath myjar.jar mypkg.HelloWorld
_

ただし、これらの未公開のAPIを使用してよろしいですか?通常、それは本当に悪い考えです。

55

Scottが言ったように、Eclipseを使用して、探しているものの多くを取得できます。

JadClipseプラグイン を取得することをお勧めします。このプラグインは.classファイルをオンザフライで逆コンパイルし、IDEでクラスを参照するときに実際のJavaコードを表示します。

5
Mike Deck

ライブラリ [〜#〜] wala [〜#〜] を使用して、すべてのメソッドシグネチャを読み取ることができます。ただし、最初にJavaのスタブコードをロードする必要があります。次のプログラムはすべての署名を読み取る必要があります。

import com.ibm.wala.ipa.cha.ClassHierarchy; 
import com.ibm.wala.ipa.cha.IClassHierarchy; 
import com.ibm.wala.classLoader.IClass; 
import com.ibm.wala.classLoader.IMethod; 
import com.ibm.wala.ipa.callgraph.AnalysisOptions; 
import com.ibm.wala.ipa.callgraph.AnalysisScope; 
import com.ibm.wala.types.ClassLoaderReference; 
import Java.util.jar.JarFile; 
import Java.io.IOException; 
import com.ibm.wala.ipa.cha.ClassHierarchyException; 

public class methods { 
    public static void main(String[] args) throws IOException, ClassHierarchyException { 
        AnalysisScope scope = AnalysisScope.createJavaAnalysisScope(); 
        scope.addToScope(ClassLoaderReference.Primordial, new JarFile("jSDG-stubs-jre1.5.jar")); 
        scope.addToScope(ClassLoaderReference.Application, new JarFile("myProgram.jar")); 
        IClassHierarchy cha = ClassHierarchy.make(scope); 

        for (IClass cl : cha) { 
            if (cl.getClassLoader().getReference().equals(ClassLoaderReference.Application)) { 
                for (IMethod m : cl.getAllMethods()) { 
                    String ac = ""; 
                    if (m.isAbstract()) ac = ac + "abstract "; 
                    if (m.isClinit()) ac = ac + "clinit "; 
                    if (m.isFinal()) ac = ac + "final ";  
                    if (m.isInit()) ac = ac + "init ";  
                    if (m.isNative()) ac = ac + "native ";  
                    if (m.isPrivate()) ac = ac + "private "; 
                    if (m.isProtected()) ac = ac + "protected ";  
                    if (m.isPublic()) ac = ac + "public ";  
                    if (m.isSynchronized()) ac = ac + "synchronized ";  
                    System.out.println(ac + m.getSignature()); 
                } 
            } 
        } 
    } 
} 

here から適応されたWALAバージョンを使用する場合、Dalvik(Android Apps)も同様です。

4
milnet

Eclipseを使用している場合は、プロジェクトのクラスパスに追加して、ツリービューやコンテンツアシストを使用して探索できます。

他のIDEでも同様のことができると思います。

コマンドラインの観点から、それを解凍して(jar xf foo.jar)、すべてのファイルに対してjavapを使用できます。

4

(抽象クラ​​スではなく)通常のクラスのメソッドを知るためのクイックヘルプ、私は次のことを行います。

eclipseにリストされているメソッドの新しいclassname()。press ctrl + space。

2
  • Eclipseは素晴らしいでしょう

  • Java Decompiler は、クラスを、ソースコードの一部に変換して、クラス、メソッド、それらのシグネチャ、およびおそらくいくつかの引数の有効な値についての洞察について学習するために調査することができます。この引数にnullを渡さないでください。そうしないと、すぐにNullPointerExceptionがトリガーされます)。ただし、スリーブをロールアップしてjarを解凍し、すべてのクラスファイルに対して逆コンパイラーを実行します。これは基本的に、ドキュメント化されていないクラスのヘルプテキストに対してEclipseが行っていることです。

  • 最後に、もちろん、 "本物のプログラマー" は、逆コンパイラーを必要とせずに byte-code を直接読み取ります。

2
Bert F

Eclipse> Package Explorerを使用して、クラスとその階層を確認します。

コンテンツアシスト(オートコンプリート機能(Ctrl +スペース))も役立ちますが、未公開のAPIを使用することはお勧めしません

0
Akash Yadav