2009-06-10 7 views
38

Ho un file jar di terze parti che viene fornito con javadocs solo per una parte dell'API. C'è un modo per decodificare il file jar per ottenere un elenco completo di classi e metodi?Come ottenere le firme del metodo da un file jar?

+2

Come con la riflessione? –

risposta

43

jar tf elencherà i contenuti per voi. javap ti permetterà di vedere più dettagli delle classi (vedi la guida agli strumenti).

Per esempio se si dispone di una classe denominata mypkg.HelloWorld in un barattolo myjar.jar quindi eseguirlo come

javap -classpath myjar.jar mypkg.HelloWorld 

Tuttavia, sei sicuro di voler essere utilizzare queste API inediti? Di solito è una pessima idea.

3

Se si utilizza eclipse, è sufficiente aggiungerlo al percorso di classe di un progetto ed esplorarlo utilizzando la visualizzazione di albero e/o l'assistenza per i contenuti.

Suppongo che altri IDE possano fare simili.

Da un punto di vista della riga di comando, è possibile annullarlo (jar xf foo.jar) e utilizzare javap su tutti i file.

5

Come ha detto Scott, è possibile utilizzare Eclipse per ottenere molto di ciò che si sta cercando.

Si consiglia di ottenere lo JadClipse plugin che decompilerà i file .class al volo e mostrerà il codice Java effettivo mentre si esplorano le classi nell'IDE.

+0

Accetto. Una combinazione molto potente. –

1
  • Eclipse grande lavoro

  • Un Java Decompiler si tradurrebbe le classi di nuovo in qualche semblence del codice sorgente che si potrebbe studiare per conoscere le classi, i metodi, le loro firme, e forse anche una certa comprensione in valori validi per alcuni argomenti (es. non passare un null per questo argomento o innescherai immediatamente una NullPointerException). Ma rimboccati le maniche per aprire il jar e avviare il decompilatore contro tutti i file di classe. Questo è essenzialmente ciò che Eclipse sta facendo per il testo di aiuto con classi non documentate.

  • Infine, naturalmente, un "real programmer" leggerebbe il byte-code direttamente senza necessità di un decompilatore.

2

un aiuto rapido per conoscere i metodi di una classe normale (classe non astratta), faccio quanto segue.

nuovo nome classe(). Premere ctrl + spazio per l'elenco dei metodi in eclissi.

0

Utilizzare Eclipse> Esplora pacchetto per visualizzare le classi e la loro gerarchia.

Content Assist (funzionalità di completamento automatico (Ctrl + Spazio)) è anche un buon aiuto, ma andrei consiglierei utilizzando un'API inedito

3

È possibile utilizzare la libreria WALA di leggere tutti i metodi di firme. Dovrai comunque caricare prima Stub-Code per Java. Il seguente programma dovrebbe leggere tutte le firme:

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

Se si utilizza la WALA-versione adattata da here lo fa Dalvik (per esempioApp Android) pure.