Bonjour à tous,

J'utilise un Iterator sur un Set ramené par Map.entrySet.
Pour rappel cette méthode renvoie un Set<Map.Entry>

J'aimerais comprendre la différence suivante:
- dans un code standard, je peux faire Map.entrySet.getKey()
- avec l'API de reflection, sur une instance de HashMap, l'appel à la méthode getKey lance une IllegalAccessException !

En y regardant de plus près, on voit que Map.Entry (et getKey) a un niveau package, alors que HashMap.Entry (qui hérite de Map.Entry) a un niveau package aussi mais que getKey est public.
En toute logique, Map.entry.getKey ne devrait pas être accessible de l'extérieur du package tandis que HashMap.entry.getKey devrait l'être. Hors il semble que ce soit l'inverse qui soit possible !

(je suis en Java 1.5)

Si quelqu'un peut me dire où je me plante, je serais content de comprendre...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
	public static void main(String[] args) throws Throwable {
		// récupération de la méthode getKey
		Method mapGetKey = Map.Entry.class.getDeclaredMethod("getKey");
		// récupération d'une instance de HashMap.entry pour pouvoir faire un getKey
		// NB: je ne peux pas avoir directement HashMap.Entry.class car elle est niveau package
		HashMap<String, String> hm = new HashMap();
		hm.put("a", "b");
		Map.Entry entry = (Entry) hm.entrySet().iterator().next();
		Method hashMapGetKey = entry.getClass().getDeclaredMethod("getKey");
 
		// je vais récupérer a-b
		//System.out.println(hashMapGetKey.invoke(entry));	// can not access a member of class java.util.HashMap$Entry with modifiers "public"
		System.out.println(mapGetKey.invoke(entry));	// a
		System.out.println(hm.entrySet().iterator().next().getKey());	// a
	}