APIの一部のみのjavadocsに付属するサードパーティのjarファイルがあります。クラスとメソッドの完全なリストを取得するためにjarファイルをリバースエンジニアリングする方法はありますか?
7 に答える
スコットが言ったように、あなたはあなたが探しているものの多くを手に入れるためにEclipseを使うことができます。
.classファイルをその場で逆コンパイルし、IDEでクラスを参照するときに実際のJavaコードを表示するJadClipseプラグインを入手することをお勧めします。
Eclipseを使用している場合は、それをプロジェクトのクラスパスに追加し、ツリービューやコンテンツアシストを使用して探索することができます。
他のIDEでも同様のことができると思います。
コマンドラインの観点からは、jarを解除して(jar xf foo.jar)、すべてのファイルに対してjavapを使用できます。
ライブラリ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アプリなど)も使用されます。
Eclipseはうまく機能します
Javaデコンパイラーは、クラスをソースコードのいくつかの類似物に変換し直して、クラス、メソッド、それらの署名、さらにはいくつかの引数の有効な値についての洞察を学ぶことができます(たとえば、nullを渡さないでください)。この引数を指定しないと、すぐにNullPointerExceptionがトリガーされます)。しかし、袖をまくり上げてjarファイルを解凍し、すべてのクラスファイルに対して逆コンパイラーを実行します。これは基本的に、ドキュメント化されていないクラスのヘルプテキストに対してEclipseが行っていることです。
最後に、もちろん、「実際のプログラマー」は、逆コンパイラーを必要とせずにバイトコードを直接読み取ります。
通常のクラス(抽象クラスではない)のメソッドを知るためのクイックヘルプ、私は次のことを行います。
new classname()。Eclipseにリストするメソッドのctrl+spaceを押します。
Eclipse> Package Explorerを使用して、クラスとその階層を確認します。
コンテンツアシスト(オートコンプリート機能(Ctrl +スペース))も良いヘルプですが、未公開のAPIを使用することはお勧めしません