Comment obtenir des signatures de méthode à partir d’un fichier jar?

J’ai un fichier jar tiers fourni avec javadocs pour une partie seulement de l’API. Existe-t-il un moyen de procéder au reverse engineering du fichier jar pour obtenir une liste complète des classes et des méthodes?

jar tf va lister le contenu pour vous. javap vous permettra de voir plus de détails sur les classes (voir le guide des outils).

Par exemple, si vous avez une classe nommée mypkg.HelloWorld dans un myjar.jar jar myjar.jar exécutez-le comme

 javap -classpath myjar.jar mypkg.HelloWorld 

Cependant, êtes-vous sûr de vouloir utiliser ces API non publiées? C’est généralement une très mauvaise idée.

Comme l’a dit Scott, vous pouvez utiliser Eclipse pour obtenir beaucoup de ce que vous recherchez.

Je recommanderais d’obtenir le plugin JadClipse qui décomstackra les fichiers .class à la volée et vous montrera le code Java réel lorsque vous parcourez les classes de l’EDI.

Si vous utilisez eclipse, vous pouvez simplement l’append au classpath d’un projet et l’explorer en utilisant l’arborescence et / ou l’assistant de contenu.

Je suppose que d’autres IDE peuvent faire la même chose.

Du sharepoint vue de la ligne de commande, vous pouvez le désarchiver (jar xf foo.jar) et utiliser javap contre tous les fichiers.

Vous pouvez utiliser la bibliothèque WALA pour lire toutes les signatures de méthodes. Vous devrez cependant charger Stub-Code pour Java en premier. Le programme suivant devrait lire toutes les signatures:

 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(Ssortingng[] 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()) { Ssortingng 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()); } } } } } 

Si vous utilisez la version WALA adaptée d’ ici, il utilise également Dalvik (par exemple, Android Apps).

une aide rapide pour connaître les méthodes d’une classe normale (pas de classe abstraite), je fais ce qui suit.

new classname (). Appuyez sur ctrl + espace pour la liste des méthodes dans eclipse.

  • Eclipse fonctionnerait bien

  • Un Java Decomstackr traduirait les classes en un semblant de code source que vous pourriez étudier pour en savoir plus sur les classes, les méthodes, leurs signatures et peut-être même quelques informations sur des valeurs valides pour certains arguments (par exemple, ne pas cet argument ou vous allez immédiatement déclencher une exception NullPointerException). Mais retroussez vos manches pour décaler le pot et lancez le décompilateur contre tous les fichiers de classe. C’est essentiellement ce que fait Eclipse pour du texte d’aide avec des classes non documentées.

  • Enfin, bien sûr, un “vrai programmeur” lirait directement le code d’octet sans avoir besoin d’un décompilateur.

Utilisez Eclipse> Explorateur de packages pour voir les classes et leur hiérarchie.

Content Assist (fonctionnalité de saisie semi-automatique (ctrl + espace)) est également une aide utile, mais n’aiderait pas à utiliser une API non publiée