2009-06-10 10 views
38

Ich habe eine JAR-Datei von Drittanbietern, die mit den Javadocs nur für einen Teil der API geliefert wird. Gibt es eine Möglichkeit, die JAR-Datei zurückzuentwickeln, um eine vollständige Liste der Klassen und Methoden zu erhalten?Wie erhält man Methodensignaturen aus einer JAR-Datei?

+2

Wie mit der Reflexion? –

Antwort

43

jar tf wird den Inhalt für Sie auflisten. können Sie mehr Details der Klassen sehen (siehe das Tools-Handbuch).

Zum Beispiel, wenn Sie eine Klasse haben mypkg.HelloWorld in einem Glas namens myjar.jar dann laufen wie

javap -classpath myjar.jar mypkg.HelloWorld 

Sie sind jedoch sicher, dass Sie mit diesem nicht veröffentlichten APIs sein? Es ist normalerweise eine wirklich schlechte Idee.

3

Wenn Sie Eclipse verwenden, können Sie es einfach zum Klassenpfad eines Projekts hinzufügen und mithilfe der Baumstruktur und/oder der Inhaltshilfe erkunden.

Ich würde annehmen, dass andere IDEs ähnliches tun können.

Vom Standpunkt der Befehlszeile aus können Sie es aufheben (jar xf foo.jar) und javap für alle Dateien verwenden.

5

Wie Scott sagte, können Sie mit Eclipse viel von dem bekommen, wonach Sie suchen.

Ich würde empfehlen, die JadClipse plugin erhalten, die die .class-Dateien im laufenden Betrieb dekompilieren und zeigen Sie tatsächlichen Java-Code beim Durchsuchen der Klassen in der IDE.

+0

Zustimmen. Eine sehr starke Kombination. –

1
  • Eclipse-würde

    große Arbeit
  • A Java Decompiler übersetzen würde die Klassen zurück in eine semblence des Quellcodes, die Sie über die Klassen zu lernen, studieren zu können, die Methoden, ihre Unterschrift, und vielleicht sogar einen kleinen Einblick in gültige Werte für einige Argumente (zB übergeben Sie keine Null für dieses Argument oder Sie werden sofort eine NullPointerException auslösen). Aber krempeln Sie die Ärmel hoch, um das Glas zu lösen, und führen Sie den Decompiler gegen alle Klassendateien. Dies ist im Wesentlichen, was Eclipse für Hilfetext mit undokumentierten Klassen tut.

  • Schließlich würde natürlich "real programmer" die byte-code direkt ohne Notwendigkeit für einen Decompiler lesen.

2

eine schnelle Hilfe für Methoden einer normalen Klasse (nicht abstrakte Klasse) zu kennen, mache ich folgendes.

new Klassenname(). Drücken Sie Strg + Leerzeichen für die Methodenliste in Eclipse.

0

Verwenden Sie Eclipse> Package Explorer, um die Klassen und deren Hierarchie anzuzeigen.

Inhaltshilfe (Auto-Vervollständigen-Funktion (Strg + Leertaste)) ist auch eine gute Hilfe, aber würde nicht

3

Sie können die Bibliothek benutzen WALA auszulesen alle Methoden Signaturen unter Verwendung eines nicht veröffentlichten API empfehlen. Sie müssen jedoch zuerst Stub-Code für Java laden. Das folgende Programm sollte alle Unterschriften auslesen:

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()); 
       } 
      } 
     } 
    } 
} 

Wenn Sie die angepasste WALA-Version von here verwenden es Dalvik tut (zAndroid Apps).