2009-06-10 98 views
38

我有一個第三方jar文件,只有部分API的javadocs。有沒有辦法對jar文件進行逆向工程以獲得完整的類和方法列表?如何從jar文件獲取方法簽名?

+2

喜歡反思? – 2009-06-10 15:37:11

回答

43

jar tf將爲您列出內容。 javap將允許您查看課程的更多細節(請參閱工具指南)。

舉例來說,如果你有一個罐子myjar.jar然後命名mypkg.HelloWorld類中運行它像

javap -classpath myjar.jar mypkg.HelloWorld 

但是,你確定你想利用這些未公佈的API是什麼?這通常是一個非常糟糕的主意。

3

如果您使用的是Eclipse,您可以將其添加到項目的類路徑中,並使用樹視圖和/或內容輔助功能來探索它。

我會假設其他IDE可以做類似的。

從命令行的角度來看,你可以取消它(jar xf foo.jar)並對所有文件使用javap。

5

正如斯科特所說,您可以使用Eclipse獲取許多您正在尋找的內容。

我建議您獲取JadClipse plugin,它將在運行中反編譯.class文件,並在瀏覽IDE中的類時顯示實際的Java代碼。

+0

同意。一個非常強大的組合。 – 2009-06-10 20:53:13

1
  • 的Eclipse將工作的偉大

  • 一個Java Decompiler將類轉換回源代碼的一些semblence,你可以學習學習類,方法,他們的簽名,並且甚至一些見解轉換爲某些參數的有效值(例如,不要爲此參數傳遞null,否則將立即觸發NullPointerException)。但是捲起你的袖子來解開jar並運行反編譯器來處理所有的類文件。這實際上是Eclipse爲幫助帶有未記錄類的文本所做的。

  • 最後,當然,"real programmer"會直接讀取byte-code而不需要反編譯器。

2

快速幫助瞭解一個普通類(不是抽象類)的方法,我做以下。

新的classname()。按ctrl +空格列出日曆中的方法。

0

使用Eclipse> Package Explorer查看類和他們的層次結構。

內容輔助(自動完成功能(Ctrl +空格鍵))也是一個很好的幫助,但難道不建議更換使用未公開的API

3

您可以使用庫WALA讀出所有方法的簽名。然而,您將首先需要加載Stub-Code for 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應用程序)。