reflect - metodo invoke java
API de reflexión de Java: invocar un método sin parámetros (3)
El método que quiero invocar (sé que es público pero necesito usar la reflexión):
public byte[] myMethod()
Obtengo el objeto Method
como este y m
contiene myMethod()
(lo verifiqué con el depurador)
Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");
Finalmente necesito invocar my pasar el resultado a un objeto:
byte[] myBytes = null;
m.invoke(myBytes);
No se lanza ninguna excepción, pero myBytes
permanece nulo ... También probé lo siguiente sin más éxito:
m.invoke(myBytes, (Object[])null);
¿Cómo puedo obtener el resultado de la invocación a myBytes?
No se lanza ninguna excepción pero myBytes permanece nulo
Correcto, lo que querías allí era:
byte[] myBytes = (byte[])m.invoke(yourInstance);
Más en la documentación . Notas:
- El valor de retorno del método es el valor de retorno de
invoke
. - El primer argumento a
invoke
es la instancia en la que se llama al método (ya que ha enumerado un método de instancia, no un método estático; si fuera estático, el primer argumento seríanull
). No ha mostrado una variable que se refiera a la instancia en ninguna parte, por lo que la llaméyourInstance
en lo anterior.
Actualmente está pasando el valor de myBytes
en el método, como si fuera el objeto objetivo al que lo estaría llamando. Es el valor de retorno .
Usted quiere:
byte[] myBytes = (byte[]) m.invoke(target);
donde target
es la instancia a la que desea llamar (ya que es un método de instancia).
Si no tiene una instancia, el método tendrá que ser un método estático, en cuyo punto cambiaría la invocación a:
byte[] myBytes = (byte[]) m.invoke(null);
invoke
method toma el primer argumento como objeto de instancia para el método seguido de parámetros. Aquí la firma del método es public byte[] myMethod()
Código para invocar myMethod
:
byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());