webentwicklung-frage-antwort-db.com.de

Wie erhalte ich Methodensignaturen aus einer JAR-Datei?

Ich habe eine JAR-Datei eines Drittanbieters, die nur für einen Teil der API mit den Javadocs geliefert wird. Gibt es eine Möglichkeit, die JAR-Datei zurückzuentwickeln, um eine vollständige Liste der Klassen und Methoden zu erhalten?

43
MCS

jar tf listet den Inhalt für Sie auf. Mit javap können Sie weitere Details zu den Klassen anzeigen (siehe Tools-Handbuch).

Wenn Sie beispielsweise eine Klasse mit dem Namen mypkg.HelloWorld in einem Jar myjar.jar haben, führen Sie sie wie folgt aus

javap -classpath myjar.jar mypkg.HelloWorld

Möchten Sie jedoch diese unveröffentlichten APIs wirklich verwenden? Das ist normalerweise eine wirklich schlechte Idee.

52

Wie bereits erwähnt, können Sie mit Eclipse eine Menge von dem finden, wonach Sie suchen.

Ich würde empfehlen, das JadClipse Plugin zu verwenden, das die .class-Dateien schnell dekompiliert und Ihnen den aktuellen Java-Code anzeigt, wenn Sie die Klassen in der IDE durchsuchen.

5
Mike Deck

Sie können die Bibliothek WALA verwenden, um alle Methodensignaturen auszulesen. Sie müssen jedoch zunächst Stub-Code für Java laden. Das folgende Programm sollte alle Signaturen 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 hier verwenden, funktioniert dies auch mit Dalvik (z. B. Android-Apps).

4
milnet

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

Ich würde davon ausgehen, dass andere IDEs das gleiche können.

Aus der Sicht der Befehlszeile können Sie die Aufhebung aufheben (jar xf foo.jar) und Javap für alle Dateien verwenden.

4

eine schnelle Hilfe zum Erkennen von Methoden einer normalen Klasse (nicht abstrakten Klasse), mache ich Folgendes.

neuer Klassenname (). Drücken Sie Strg + Leerzeichen, um die Methoden in Eclipse aufzulisten.

2
  • Eclipse würde großartig funktionieren

  • Ein Java Decompiler würde die Klassen zurück in einen Teil des Quellcodes übersetzen, den Sie studieren könnten, um etwas über die Klassen, die Methoden, ihre Signaturen und vielleicht sogar einige Einsichten in gültige Werte für einige Argumente zu lernen (z. B. nicht übergeben Sie eine Null für dieses Argument, oder Sie lösen sofort eine NullPointerException aus. Aber rollen Sie die Ärmel hoch, um das Glas zu lösen und den Dekompilierer gegen alle Klassendateien auszuführen. Dies ist im Wesentlichen das, was Eclipse für Hilfetext mit undokumentierten Klassen tut.

  • Schließlich würde natürlich ein "realer Programmierer" den Byte-Code direkt lesen, ohne dass ein Decompiler erforderlich wäre.

2
Bert F

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

Content Assist (Autocomplete-Funktion (Strg + Leertaste)) ist ebenfalls eine gute Hilfe, würde jedoch die Verwendung einer nicht veröffentlichten API nicht empfehlen

0
Akash Yadav