web-dev-qa-db-fra.com

Comment obtenir des signatures de méthodes à partir d'un fichier jar?

J'ai un fichier JAR tiers qui est fourni avec les javadocs pour une partie seulement de l'API. Existe-t-il un moyen de procéder à une ingénierie inverse du fichier jar afin d'obtenir une liste complète des classes et des méthodes?

43
MCS

jar tf listera 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 jar myjar.jar, exécutez-la comme suit:

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.

52

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

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

5
Mike Deck

Vous pouvez utiliser la bibliothèque WALA pour lire toutes les signatures de méthodes. Vous devrez cependant d'abord charger le code de souscription pour Java. 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(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()); 
                } 
            } 
        } 
    } 
} 

Si vous utilisez la version adaptée de WALA à partir de ici Dalvik (par exemple, applications Android) est également utilisé.

4
milnet

Si vous utilisez Eclipse, vous pouvez simplement l'ajouter au chemin de classe d'un projet et l'explorer à l'aide de l'arborescence et/ou de l'assistant de contenu.

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

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

4
Scott Stanchfield

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 les méthodes listées dans Eclipse.

2
Balaswamy Vaddeman
  • Eclipse fonctionnerait très bien

  • A Java Decompiler 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 un aperçu des valeurs valides pour certains arguments (par exemple transmettez une valeur null pour cet argument ou vous déclencherez immédiatement une exception NullPointerException). Mais retroussez vos manches pour débloquer le fichier jar et exécuter le décompilateur contre tous les fichiers de classe. C’est essentiellement ce que fait Eclipse pour le texte d’aide avec des classes non documentées.

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

2
Bert F

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

Content Assist (fonctionnalité de saisie semi-automatique (ctrl + espace)) est également une bonne aide, mais ne recommande pas l'utilisation d'une API non publiée

0
Akash Yadav