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?
risposta
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.
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.
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.
Accetto. Una combinazione molto potente. –
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.
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.
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
È 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.
Come con la riflessione? –