reflexion reflect metodo method introspección example ejemplo clase java reflection

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ía null ). 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());