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:

  1. Utiliser Eclipse Recherche pour trouver tous les appels à B. getCurrentA();
  2. 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);
        }
    }
  3. 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
        }
    }
  4. 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
            }
        }
    }
  5. Répétez les étapes 2 à 4 pour la prochaine 216 matchs... Yay.

S'il vous plaît aider.

Si vous êtes intéressé par un très instance spécifique de 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é callen
C'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