it-swarm.com.de

Java Reflection-API: Aufrufen einer Methode ohne Parameter

Die Methode, die ich aufrufen möchte (ich weiß, dass es öffentlich ist, aber ich muss Reflektion verwenden):

public byte[] myMethod()  

Ich bekomme das Method-Objekt so und m enthält myMethod() (ich habe es mit dem Debugger überprüft)

Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");

Zum Schluss muss ich m aufrufen und das Ergebnis an ein Objekt übergeben:

byte[] myBytes = null;
m.invoke(myBytes);

Es wird keine Ausnahme ausgelöst, aber myBytes bleibt null ... Ich habe auch Folgendes ohne Erfolg versucht:

m.invoke(myBytes, (Object[])null);

Wie kann ich das Ergebnis des Aufrufs von myBytes erhalten?

16
znat

Es wird keine Ausnahme ausgelöst, aber myBytes bleibt null

Richtig, was Sie dort wollten, war:

byte[] myBytes = (byte[])m.invoke(yourInstance);

Mehr in die Dokumentation . Anmerkungen:

  • Der Rückgabewert der Methode ist der Rückgabewert von invoke.
  • Das erste Argument für invoke ist die Instanz, für die die Methode aufgerufen werden soll (da Sie eine Instanzmethode und keine statische Methode aufgelistet haben; wenn sie statisch wäre, wäre das erste Argument null). Sie haben nirgendwo eine Variable gezeigt, die sich auf die Instanz bezieht. Daher habe ich sie oben als yourInstance bezeichnet.
24
T.J. Crowder

Sie übergeben derzeit den Wert von myBytes an an die Methode - als ob es das Zielobjekt wäre, für das Sie es aufrufen würden. Es ist der return value.

Sie wollen:

byte[] myBytes = (byte[]) m.invoke(target);

dabei ist target die Instanz, für die Sie es aufrufen möchten (da es sich um eine Instanzmethode handelt).

Wenn Sie keine Instanz haben, muss es sich bei der Methode um eine statische Methode handeln. Dann ändern Sie den Aufruf in:

byte[] myBytes = (byte[]) m.invoke(null);
9
Jon Skeet

Die invoke-Methode nimmt das erste Argument als Instanzobjekt für die Methode, gefolgt von Parametern. Hier ist die Methodensignatur public byte[] myMethod()

Code zum Aufruf von myMethod:

byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());
0
Bimales Mandal