2014-09-19 2 views
3

Je comprends que publicLookup() est plus rapide qu'un lookup() pour les méthodes publiques, et j'aimerais l'utiliser. Si je devais utiliser MethodHandles.publicLookup().unreflect(Method) sur un Method qui n'est pas intrinsèquement public mais que j'ai appelé setAccessible(true), cela fonctionnerait-il?Combinaison de MethodHandles.publicLookup() avec Method.setAccessible (true)

+1

Pourquoi ne pas essayer et découvrir? –

Répondre

4

Depuis un Method sur lequel setAccessible(true) a été invoqué avec succès peut être appelé par tout le monde, il peut en irréfléchi utilisant le MethodHandles.publicLookup() comme avec tout autre objet Lookup. Après tout, c'est la seule façon d'utiliser le remplacement d'accès avec MethodHandle car java.lang.invoke n'offre aucune fonctionnalité de remplacement d'accès seul.

La démonstration suivante utilise un Field plutôt qu'un Method mais a un résultat impressionnant:

Field m = String.class.getDeclaredField("value"); 
m.setAccessible(true); 
MethodHandle mh = MethodHandles.publicLookup().unreflectGetter(m); 
char[] ch = (char[])mh.invoke("hello"); 
Arrays.fill(ch, '*'); 
System.out.println("hello"); 
+0

ah, malheureusement, je n'ai pas besoin de lancer ça pour connaître la sortie, comme je l'ai déjà fait avec ça. cependant, merci pour la réponse – DziNeIT