Comment avoir touts les méthodes invoquées dans une classe? [Résolu]

Signaler
Messages postés
45
Date d'inscription
vendredi 13 mars 2009
Statut
Membre
Dernière intervention
3 février 2014
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
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

Messages postés
16361
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 juin 2021
122
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.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
salut,

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

a+
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
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+