Maison >Java >javaDidacticiel >Comment pouvez-vous appeler des méthodes privées à l'aide de Reflection en Java ?

Comment pouvez-vous appeler des méthodes privées à l'aide de Reflection en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 07:52:18866parcourir

How Can You Invoke Private Methods Using Reflection in Java?

Invocation de méthodes privées par réflexion

En Java, l'invocation de méthodes privées par réflexion directe n'est pas autorisée. Cependant, il existe des approches alternatives pour obtenir cette fonctionnalité.

Considérez le scénario suivant dans lequel une méthode, initialement définie comme privée, doit être invoquée par réflexion :

Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");

if ("SomeObject".equals(objectName))
    object = someObject;
else
    object = this;

method = object.getClass().getMethod(methodName, (Class[]) null);

Ce code tente de obtenir une référence à la méthode privée spécifiée par l'attribut "methodName". Cependant, cette approche déclenche une "NoSuchMethodException" car les méthodes privées sont inaccessibles via la réflexion conventionnelle.

Pour surmonter cette limitation, nous pouvons utiliser la méthode getDeclaredMethod :

Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
Object r = method.invoke(object);

La méthode getDeclaredMethod récupère un méthode quelle que soit sa visibilité. La méthode setAccessible nous permet de contourner la restriction d'accès privé et d'invoquer la méthode.

Attention :

  • getDeclaredMethod trouve uniquement les méthodes déclarées dans la classe actuelle. Pour les méthodes héritées, vous devrez peut-être parcourir la hiérarchie des classes.
  • Certains SecurityManagers peuvent interdire l'utilisation de setAccessible. Envisagez d'exécuter l'invocation en tant que PrivilegedAction à l'aide d'AccessController ou de Subject.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn