![]() |
Introspection |
Soit la classe suivante, représentant des graphes orientés avec un noeud initial:
public class Graph { public Graph(Node start) { this.start = start; } public class Node { public Node(String name) { this.name=name; } public int hashCode() { return name.hashCode(); } public boolean equals(Object o) { if ((! o instanceof Node)) return false; return name.equals(((Node)o).name); } public void add(Node dest) { transitions.add(dest); } public Iteratortransitions() { return transitions.iterator(); } private final String name; private final ArrayList transitions = new ArrayList (); } private final Node start; }
Noeud initial : n1 n1: n2 n3 n2: n4 n3: n4: n3 n1 n5 n5: n5
Les itérateurs obtenus à partir des collections du paquetage java.util sont dits fail-fast, ce qui signifie qu'une modification de la structure itérée entrelacée avec l'utilisation de l'itérateur provoque par cette dernière la levée d'une ConcurrentModificationException. Pour contrôler ces modifications, les itérateurs utilisent le champ modCount protégé de la classe abstraite AbstractList. Pour vous en convaincre, vous pouvez extraire le code source de ces classes de l'archive src.zip.
En utilisant les mécanismes de réflexion offerts par le paquetage java.lang.reflect, faites en sorte que, dans le cas particulier l'exemple suivant, l'exception ConcurrentModificationException ne soit pas levée par l'itérateur d'un ArrayList, malgré la modification faite sur cette structure. Pour celà, vous devrez modifier par réflexion la valeur du champ modCount de la liste.
ArrayListlist=new ArrayList (); Collections.addAll(list,args); for(int i=0;i<list.size();i++) { if (i%3==0) list.add(list.get(i)+" stop"; }
On souhaite maintenant avoir un algorithme qui affiche n'importe quel Object au format XML suivant :
<instance class="java.awt.Point" id="1"> <field name="x" value="10"> <field name="y" value="20"> </instance>ou pour les noeuds du graphe :
<instance class="Graphe" id="1"> <field name="start" value="2"> </instance> <instance class="Node" id="2"> <field name="name" value="root"> <field name="transitions" value="3"> </instance> <instance class="java.util.ArrayList" id="3"> <field name="modCount" value="3"> <field name="size" value="2"> <field name="elementData" value="4"> </instance> <instance class="java.lang.Object[]" id="4"> <field name="length" value="11"> <field value="5"> <field value="6"> </instance> <instance class="Node" id="5"> <field name="name" value="node1"> <field name="transitions" value="7"> </instance> ...Vous veillerez à sauver les types primitifs et String suivant leurs valeurs et les objets sous forme de valeur d'ids et les tableaux de façon spécials.