La méthode que je veux invoquer (je sais que c'est public mais je dois utiliser la réflexion):
public byte[] myMethod()
Je reçois l'objet Method
comme ceci et m
contient myMethod()
(j'ai vérifié avec le débogueur)
Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");
Enfin, je dois invoquer m et transmettre le résultat à un objet:
byte[] myBytes = null;
m.invoke(myBytes);
Aucune exception n'est levée, mais myBytes
reste null ... J'ai aussi essayé ce qui suit sans plus de succès:
m.invoke(myBytes, (Object[])null);
Comment puis-je obtenir le résultat de l'invocation à myBytes?
Aucune exception n'est levée mais myBytes reste à zéro
Correct, ce que tu voulais il y avait:
byte[] myBytes = (byte[])m.invoke(yourInstance);
Plus dans la documentation . Remarques:
invoke
.invoke
est l'instance sur laquelle appeler la méthode (puisque vous avez répertorié une méthode d'instance, et non une méthode statique; si elle était statique, le premier argument serait null
). Vous n'avez montré aucune variable faisant référence à l'instance, vous l'avez donc appelée yourInstance
dans ce qui précède.Vous transmettez actuellement la valeur de myBytes
à la méthode - comme s'il s'agissait de l'objet cible sur lequel vous l'appelez. C'est la valeur retour .
Tu veux:
byte[] myBytes = (byte[]) m.invoke(target);
où target
est l'instance sur laquelle vous souhaitez l'appeler (en tant que méthode d'instance).
Si vous n'avez pas d'instance, la méthode devra être une méthode statique. Vous devez alors modifier l'invocation en:
byte[] myBytes = (byte[]) m.invoke(null);
La méthode invoke
prend le premier argument en tant qu'objet d'instance pour la méthode suivie de paramètres. Ici, la signature de la méthode est public byte[] myMethod()
Code à invoquer myMethod
:
byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());