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 Iterator<Node> transitions() { return transitions.iterator(); } private final String name; private final ArrayList<Node> transitions = new ArrayList<Node>(); } private final Node start; }
Noeud initial : n1 n1: n2 n3 n2: n4 n3: n4: n3 n1 n5 n5: n5
Déclarer une annotation @Marked avec un attribut de
type int appelé level dont la valeur paer défaut est 2
Écrire une fonction printMarked(int level)
qui affiche l'ensemble des champs et méthodes
(tous même les pas visibles et ceux hérités) annotés par une annotation
@Marked dont l'attribut level est au moins
level.
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
regarder le code source avec eclipse.
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.
ArrayList<String> list=new ArrayList<String>(); Collections.addAll(list,args); for(String s:list) { if (s.length()%2==0) list.add(s+" stop"); }
ClassLoader loader=new ClassLoader() { ... }; loader.loadClass("fr.umlv.java.td7.Graph"); // affiche load fr.umlv.java.td7.Graph
URLConnection con=url.openConnection(); byte[] datas=new byte[con.getContentLength()]; DataInputStream stream= new DataInputStream(con.getInputStream()); stream.readFully(datas);Modifier votre classloader pour qu'il charge aussi la classe Node.