Comment avoir touts les méthodes invoquées dans une classe?

Résolu
dounatt Messages postés 45 Date d'inscription vendredi 13 mars 2009 Statut Membre Dernière intervention 3 février 2014 - Modifié par cs_Julien39 le 5/02/2014 à 10:00
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 20 févr. 2014 à 21:52
Bonjour,
je veux avoir, pour une classe donnée, toutes les méthodes invoquées dans cette classe, y comprises celles d'autres classes. par exemple:

public class Class1 {

public void aff8(){
 System.out.println("8");
}
public void aff9(){
 System.out.println("9");
}
}

public class Class2 {
public void aff1(){
 System.out.println("1");
}
public void aff2(){
 System.out.println("2");
 
       Class1 jjj = new Class1();
 jjj.aff8();
}

public void aff3(){
 System.out.println("3");
}
}



Dans ce cas, si je cherche les méthodes invoquées dans la classe Class2, je dois avoir:aff1, aff2, aff8, aff3.
Si j'utilise Class2.getMethods j'aurai seulement aff1, aff2, aff3.
Aidez moi SVP. Merci.

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
3 févr. 2014 à 19:08
De manière standard tu ne peux pas faire ça, parce qu'à la compilation un certain nombre d'informations "disparaissent" et qu'il n'est pas possible de les récupérer par introspection.

Ce qu'il faudrait faire c'est du désassemblage puis un traitement d'analyse derrière, ça se fait, mais c'est une autre paire de manches. Voici par exemple comment utiliser la commande javap :

javap -c Class1
Compiled from "Class1.java"
public class Class1 {
  public Class1();
    Code:
       0: aload_0
       1: invokespecial #8    // Method java/lang/Object."<init>":()V
       4: return

  public void aff8();
    Code:
       0: getstatic     #15   // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #21   // String 8
       5: invokevirtual #23   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  public void aff9();
    Code:
       0: getstatic     #15   // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #30   // String 9
       5: invokevirtual #23   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}


javap -c Class2
Compiled from "Class2.java"
public class Class2 {
  public Class2();
    Code:
       0: aload_0
       1: invokespecial #8    // Method java/lang/Object."<init>":()V
       4: return

  public void aff1();
    Code:
       0: getstatic     #15   // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #21   // String 1
       5: invokevirtual #23   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  public void aff2();
    Code:
       0: getstatic     #15   // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #30   // String 2
       5: invokevirtual #23   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: new           #32   // class Class1
      11: dup
      12: invokespecial #34   // Method Class1."<init>":()V
      15: astore_1
      16: aload_1
      17: invokevirtual #35   // Method Class1.aff8:()V
      20: return

  public void aff3();
    Code:
       0: getstatic     #15   // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #41   // String 3
       5: invokevirtual #23   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

Au vu de ta question, ce qui t'intéresse ce sont les
invokevirtual
qui te permettent d'obtenir les méthodes appelées à l'intérieur d'une méthode.
On a bien par exemple Class1.aff8() appelée par Class2.aff2(), sans oublier tous les System.out.println qui sont également des méthodes appelées par tes différentes méthodes.
1
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 févr. 2014 à 10:01
salut,

J'ai édité ton message pour ajouter des balises permettant de coloriser le code. Essayes de le faire la prochaine fois.

a+
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 févr. 2014 à 21:52
Salut,

Faute de retour de l'auteur, je marque le sujet comme résolut et je met +1 à ta réponse KX qui me semble tout à fait adaptée.

a+
0
Rejoignez-nous