49

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

4

7 に答える 7

63

jar tf内容が一覧表示されます。javapクラスの詳細を確認できます(ツールガイドを参照)。

たとえばmypkg.HelloWorld、jarで名前が付けられたクラスがある場合は、次のmyjar.jarように実行します。

javap -classpath myjar.jar mypkg.HelloWorld

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

于 2009-06-10T15:38:54.030 に答える
6

スコットが言ったように、あなたはあなたが探しているものの多くを手に入れるためにEclipseを使うことができます。

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

于 2009-06-10T15:42:03.710 に答える
5

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

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

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

于 2009-06-10T15:39:07.553 に答える
4

ライブラリ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()); 
                } 
            } 
        } 
    } 
} 

ここから適応したWALAバージョンを使用すると、Dalvik(Androidアプリなど)も使用されます。

于 2013-08-16T11:13:16.687 に答える
3
  • Eclipseはうまく機能します

  • Javaデコンパイラーは、クラスをソースコードのいくつかの類似物に変換し直して、クラス、メソッド、それらの署名、さらにはいくつかの引数の有効な値についての洞察を学ぶことができます(たとえば、nullを渡さないでください)。この引数を指定しないと、すぐにNullPointerExceptionがトリガーされます)。しかし、袖をまくり上げてjarファイルを解凍し、すべてのクラスファイルに対して逆コンパイラーを実行します。これは基本的に、ドキュメント化されていないクラスのヘルプテキストに対してEclipseが行っていることです。

  • 最後に、もちろん、「実際のプログラマー」は、逆コンパイラーを必要とせずにバイトコードを直接読み取ります。

于 2009-06-10T16:00:29.650 に答える
2

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

new classname()。Eclipseにリストするメソッドのctrl+spaceを押します。

于 2011-12-06T10:28:17.377 に答える
0

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

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

于 2012-04-01T17:19:28.220 に答える