web-dev-qa-db-fra.com

API de réflexion Java: appel d'une méthode sans paramètres

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?

16
znat

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:

  • La valeur de retour de la méthode est la valeur de retour de invoke.
  • Le premier argument de 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.
24
T.J. Crowder

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);

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);
9
Jon Skeet

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());
0
Bimales Mandal