Comment puis-je invoquer un privé méthode statique à l'aide de la réflexion (Java)?
Je voudrais invoquer un privé méthode statique. J'ai son nom. J'ai entendu qu'il peut être fait à l'aide de Java réflexion mécanisme. Comment puis-je le faire?
EDIT: Un problème que j'ai rencontré quand j'invoque la méthode est la façon de spécifier le type de son argument. Ma méthode reçoit un argument et son type est de la Carte. Donc je ne peux pas faire Map<User, String>.TYPE
(Au moment de l'exécution, il n'y a pas une telle chose comme la Carte à cause de Java Type d'effacement). Est-il une autre façon d'obtenir de la méthode?
- essayez
MyClass.class.getDeclaredMethod("myMethod", Map.class);
pour votre cas - Curieusement les informations génériques de la méthode est encore disponible au moment de l'exécution.
Method.getGenericParameterTypes
Vous devez vous connecter pour publier un commentaire.
Disons que vous voulez l'appeler MyClass.myMethod(int x);
YourClass.class
comme argument, leInteger.TYPE
est juste une béquille pour les types primitifs, qui n'ont pas de réel de la classe.o
.o
, c'est pas de l'objet appelant (si vous en avait un objet, il doit être le premier argument deinvoke
).o
pour obtenir la valeur?String
, vous pouvez lancero
à unString
.Method.invoke
doit être en mesure de retourner les valeurs de toutes sortes de méthodes, de sorte que le type de retour devrait-il utiliser dans sa déclaration de méthode? Il ne peut pas savoir le type, de sorte qu'il utiliseObject
(comme certains autres de réflexion trucs fait aussi bien).Invoquer principal de la réflexion tutoriel
Non, vous ne pouvez pas dire
Map<K,V>.class
. C'est à cause de type d'effacement. Au moment de l'exécution, il n'y a pas une telle chose.Heureusement, vous peut dire juste un bon vieux
Map.class
. C'est tout de même lors de l'exécution.Si les mises en garde vous dérange, recherche pour d'autres questions liées aux médicaments génériques et le type d'effacement, il y a une mine d'informations sur le sujet ici.
J'utilise une méthode unique qui encapsule l'obtention de la cible méthode, puis de l'appeler. Probablement a certaines limites, bien sûr. Voici la méthode à mettre dans une classe et ses JUnit test:
}
Il y a un certain nombre de vérifié les exceptions qui peuvent être levées. Les deux parameterTypes et les paramètres de l'ellipse arguments (de longueur variable), remplissez-les si nécessaire. La JVM par le cahier des charges ont fortement typé convention d'appel de sorte que vous besoin de connaître les types de paramètres.
Avec cela dit, sauf si vous écrivez quelque sorte de conteneur d'application, serveur de composant conteneur, RMI-comme système, ou de la JVM base de la langue, vous devriez éviter de le faire.