2011-02-11 3 views
3

Est-il possible de générer un graphique d'appel global d'une application?Comment générer un graphique d'appel pour un projet Java

Fondamentalement, j'essaie de trouver la classe la plus importante d'une application.

Je suis à la recherche d'options pour Java.

J'ai essayé Doxy Gen, mais il ne génère que des graphes d'héritage.

Mon script actuel:

#! /bin/bash 

echo "digraph G 
{" 
find $1 -name \*.class | 
    sed s/\\.class$// | 
    while read x 
    do 
     javap -v $x | grep " = class" | sed "s%.*// *%\"$x\" -> %" | sed "s/$1\///" | sed "s/-> \(.*\)$/-> \"\1\"/" 
    done 
echo "}" 
+0

double possible de [Comment générer un graphe d'appel Java] (http://stackoverflow.com/questions/1982890/comment-générer-un-java-call-graph) –

+0

"Le plus important", probablement pas, mais cela exposerait probablement les classes avec trop de fonctionnalités, je pense. –

+2

@Sean, il peut s'agir d'une * question * en double mais aucune des * réponses * ne s'y adresse. –

Répondre

2

javap -v et un peu de perl vous obtiendrez des dépendances entre classes. Vous pouvez rendre votre analyseur légèrement plus sophistiqué et obtenir des dépendances entre les méthodes.

Mise à jour: ou si vous avez soit un * nix ou Cygwin, vous pouvez obtenir une liste des dépendances comme

 
find com/akshor/pjt33/image -name \*.class | 
    sed s/\\.class$// | 
    while read x 
    do 
     javap -v $x | grep " = class" | sed "s%.*// *%$x -> %" 
    done 

Ajouter un en-tête et un pied de page et vous pouvez le transmettre à point pour rendre un graphique. Si vous voulez juste savoir quelles sont les classes les plus utilisées par d'autres classes, comme votre question implique, alors

 
find com/akshor/pjt33/image -name \*.class | 
    sed s/\\.class$// | 
    while read x 
    do 
     javap -v $x | grep " = class" | sed "s%.*// *%%" 
    done | 
     sort | uniq -c | sort -n 
+0

Je ne suis pas sûr que cela puisse aider. Et je ne connais presque rien à propos de Perl. Je sais que c'est une honte. –

+0

@Tiago, vous pouvez lire les entrées et appliquer une expression régulière en Java aussi, c'est juste plus bavard. –

+0

Je vais essayer. Je devine que cette commande recherchera des fichiers dans 'com/akshor/pjt33/image' avec l'extension' * .class', mais ne devrait-elle pas être '* .java'? J'avais l'impression que la commande 'javap' lisait les fichiers java et non les fichiers de classe. –

1

Pour une analyse de code avancé, vous voudrez peut-être jeter un oeil à http://www.moosetechnology.org/

Vive
Thomas

(edit: déplacé ici par demande générale , Voir: How to generate a Java call graph)

+0

LOL ... tu m'as battu au coup de poing (+1) –

+1

Je ne pense pas que tu comprennes ce que l'OP recherche. –

+0

@Manrico scusa :) –

Questions connexes