Comment puis-je obtenir de l'Appel complet de la Hiérarchie d'un code source Java?
C'est un peu délicat à expliquer. J'ai une classe A:
public class A {
private Integer a1;
private Integer a2;
//getters and setters.
}
Il est statique de la classe B qui renvoie ma classe A:
public static class B {
public static A getCurrentA() {
return a;
}
}
J'ai besoin de trouver toutes les occurrences de la classe Un retourné par B. Donc, disons que la classe C des appels c.setA(B.getCurrentA())
et puis plus loin il y a un appel à c.getA().getA2();
, je veux trouver toutes ces.
Dans le réel scénario, j'ai 217 classes différentes qui appellent B.getCurrentA()
. Je ne peux pas manuellement suivre tous les appels dans Eclipse et de trouver les méthodes qui sont appelé.
Eclipse hiérarchie d'appel de la vue seule me montre tous les appels à B.getCurrentA()
.
Comment puis-je y parvenir?
MODIFIER
Chris Hayes compris ce que je veux faire. Afin de revoir certaines vraiment mauvais héritage de code sans casser tout le système, j'ai d'abord besoin d'affiner certaines requêtes à l'aide de Hibernate projections (tous les mappé entité dans le système est chargé avec impatience, et de nombreuses entités sont liées, de sorte que certaines requêtes prendre beaucoup de temps à aller chercher de tout). Mais d'abord, j'ai besoin de trouver les propriétés qui sont utilisés de sorte que je ne suis pas une exception NullPointerException quelque part...
Voici un exemple de ce que j'aurais à faire à la main:
- Utiliser Eclipse Recherche pour trouver tous les appels à B. getCurrentA();
- L'ouverture de la première méthode, disons que c'est celui ci-dessous:
public class CController { C c = new C(); CFacade facade = new CFacade(); List<C> Cs = new ArrayList<C>(); public void getAllCs() { c.setA(B.getCurrentA()); //found it! facade.search(c); } }
- Ouvert la méthode de recherche dans le CFacade classe:
public class CFacade { CBusinessObject cBo = new CBusinessObject(); public List<C> search(C c) { //doing stuff... cBo.verifyA(c); cBo.search(c); //yes, the system is that complicated } }
- Ouvrir le verifyA méthode dans le CBusinessObject classe et identifier ce champ a2 est utilisé:
public class CBusinessObject { public void verifyA(c) { if (Integer.valueOf(1).equals(c.getA().getA2())) { //do stuff else { //something else } } }
- Répétez les étapes 2 à 4 pour la prochaine 216 matchs... Yay.
S'il vous plaît aider.
B.getCurrentA()
et vous avez accès au code où il est appelé, vous pourriez être en mesure d'imprimer l'état courant de la pile à un journal. Ou définissez un point d'arrêt, puis exécutez le programme, de sorte que l'exécution s'arrête au point d'arrêt.Essayez
Thread.dumpStack()
pour voir d'où tu méthode a été callenC'est beaucoup plus que juste de la hiérarchie d'appel. Vous souhaitez suivre partout où la valeur de retour est stockée et utilisée. Cela sonne comme une tâche monumentale de l'analyse statique, pour tenter de déterminer où cette valeur peut aller.
Je ne pense pas que ce soit possible de déterminer de manière statique
Je suis l'impression que je vais avoir à écrire moi-même... Peut-être créer un projet qui sous-classe, de simuler une exécution et d'appel Thread.currentThread().getStackTrace()? Ou est-il un moyen d'utiliser la Réflexion pour faire une analyse statique?
OriginalL'auteur Tarek | 2013-12-13
Vous devez vous connecter pour publier un commentaire.
Si vous voulez faire des modifications du code source/refactoring, vous aurez à trouver manuellement tous les usages et appliquer vos modifications de code;
Toute façon, j'ai deux différents l'approche
Statique de recherche
Vous pouvez simplement faire
Text Search
dans eclipse pour trouver l'occurance degetA2()
. Il vous mènera directement à l'Appelant de la méthode (ici CBusinessObject.verifyA()) -mais il vous donnera tous les getA2() les événements peuvent être de différentes classeMoment de l'exécution de la recherche
Utilisation
java instrumentation API
modifier le code octet au moment de l'exécution sur votre méthode pour trouver l'invocation de la classe et de l'exécuter en tant qu'java agent
- vous Permettre d'identifier l'appelant ne se touchent pas le code existant de la base et très utile, surtout lorsque vous n'avez pas accès au code source.Ici, vous allez comment mettre en œuvre
Étape 1 - Écrire l'Agent principal de la classe pour initier l'instrumentation
Étape 2 -Écrire un ClassFileTransformer la mise en œuvre et la capture de la méthode
Étape 3 - créer un fichier jar pour les classes de l'agent ( vous devez définir le fichier de manifeste avec premain classe, et ajouter javaassit jar) extrait de fichier de build est donnée, vous pouvez le faire manuellement ainsi
Étape 4 - lancez votre application principale avec java agent - avant que l'ensemble de VM arguments à charge de l'agent
Pré requis : vous devez
javassist.jar
dans le chemin de classe.OriginalL'auteur Satheesh Cheveri
Selon l'IDE que vous utilisez ce problème est plus simple à trouver.
Eclipse IDE est un des plus grand potentiel d'Appel de la Hiérarchie de modules existants, vous avez juste besoin de mettre la souris dans la déclaration de la méthode que vous voulez trouver et exécuter
Ctrl + Alt + H
Cela vous donnera l'ensemble de la hiérarchie de la méthode à l'aide de la méthode que vous souhaitez analyser.
Aussi de la Hiérarchie d'Appel module offre un mode où vous pouvez trouver les méthodes que votre méthode appelle.
Quelques informations supplémentaires: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_call_hierarchy_view.htm
OriginalL'auteur Kuraokami
Dans IntelliJ IDEA, si vous voulez trouver des usages de
c.getA().getA2();
clic droit surA.a2
et choisissez "rechercher les usages." De même pourA.a1
etB.getCurrentA()
. Champs non utilisés et les méthodes apparaissent dans une couleur différente dans l'IDÉE. J'ai entendu dire que l'Ide a plus de refactoring de puissance que Eclipse, mais je parie que Eclipse fait la même chose, juste un peu différemment.Également, à l'aide de grep, find, et sed, vous pouvez rechercher les méthodes appropriées, juste dans les fichiers qui sont dans le même package que l'Un ou que l'importation d'Un ou il sort par le nom.
OriginalL'auteur GlenPeterson
J'espère que j'ai bien compris votre question. Je pense que vous pouvez utiliser
grep -Irns
fonction pour trouver les appels. Vous pouvezgrep
pourgetA().getA2()
. Qui sera de retour à partir de laquelle les fonctions sont appelées avec les numéros de ligne.OriginalL'auteur SaurabhJinturkar
Plutôt que de la recherche de toutes les références à la méthode
getCurrentA
faire un scan pour toutes les références à la ClasseA
.Cela va vous montrer partout que la classe est utilisé au sein de votre programme et vous trouverez probablement qu'il est plus facile de passer à travers et d'analyse de cette liste à la main et de décider si vous avez besoin d'agir sur chaque résultat trouvé d'essayer d'en faire quelque chose de compliqué.
OriginalL'auteur Tim B
Le moyen le plus facile pour trouver Appel d'Utilisation est à l'aide de références dans eclipse,mais il y a une drôle de façon
:
OriginalL'auteur Amin Bahiraei
Je pense que l'Ide peut résoudre votre problème. Il ont une "Analyse des flux de données, et je pense que c'est en faisant ce que vous cherchez:
Voici mon exemple de code:
Exécution de l ' "Analyser les flux de données à partir d'ici" (avec le curseur sur
return a;
ligne) donne-moi ceci:Désolé de vous fournir seulement une solution avec IntelliJ (testé avec IntelliJ-13 Ultimate Edition)
OriginalL'auteur ben75