Récursivité avec introspection sur une classe
Bonjour à tous,
J'ai un exercice dans lequel je dois faire appel à de la récursivité, c'est à dire que je dois réinvoqué l'appel de ma méthode à l'intérieur de celle-ci.
Dans un 1er temps à l'aide de l'introspection "reflect", je récupère la structure de la classe appelée (nom de la classe et ses champs), pour ça je pense que c'est bon, jai dû le faire correctement.
Dans un 2ème temps (c'est là où les choses se corsent), je dois afficher via system.out.println() de nouveau les champs de la classe précédente dans celle que je suis entrain de lire et ça je ne sais pas comment faire.
je vous met un morceau de l'énoncé de mon exo afin que ça soit plus claire ainsi que le code que j'ai déjà fait.
En vous remerciant d'avance à tous.
Citation:
Le but de cet exercice est d'ecrire une methode qui affiche recursivement la structure d'une classe. La
methode display prend une classe en parametre (une String) et affiche recursivement la structure
des champs publics et prives de cette classe. Par exemple, l'evaluation de
display("NomClasse");
pourrait afficher quelquechose du genre :
@NomClasse
- Chp1: @UneAutreClasse1
+ value : @java.lang.Object
+ next : @UneAutreClasse1
La chaine @NomClasse est le nom qualifie de la classe. Suivent les champs de
la classe (ici le seul champ Chp1) precedes du caractere '-' pour les champs prives et '+' pour les
champs publics. Chaque champ est suivi de l'affichage (recursif) de sa classe. En cas de classe recursive,
comme la classe UneAutreClasse1, la classe n'est affichee que la premiere fois ou elle apparait. Ainsi, le contenu
de la classe UneAutreClasse1 est affichee une fois (la classe de l'attribut Chp1 de la classe NomClasse) et seul le
nom (qualifie) de la classe UneAutreClasse1 est affichee pour le type de l'attribut next de cette meme classe.
Plus generalement, (le contenu d'une classe n'est affiche(e) qu'une seule fois : si on execute les deux
instructions suivantes :
display("NomClasse");
display("NomClasse2");
on obtient
@NomClasse
+ value : @java.lang.Object
+ next : @NomClasse
@NomClasse
- top : @NomClasse2
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public static void display(String aClass) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class c = Class.forName(aClass);
/** Nom de la classe */
System.out.println("@" + c.getName());
Field[] theMethods = c.getDeclaredFields();
for (int i = 0; i < theMethods.length; i++) {
String methodString = theMethods[i].getName();
String returnString = theMethods[i].getType().getName();
/** Les champs public ou privés */
if(java.lang.reflect.Modifier.isPublic(theMethods[i].getModifiers())){
System.out.println(" + " + methodString + " : @" + returnString);
}else{
System.out.println(" - " + methodString + " : @" + returnString);
}
}
} |