2012-07-12 32 views
16

Me gustaría invocar un método, utilizando Java Reflection.¿Cómo invocar un método que arroja una excepción utilizando la reflexión de Java?

El problema es que este método (que escribí) arroja una excepción (creé un myCustomException). Cuando agrego una cláusula try/catch, no puedo ejecutar mi proyecto, porque Eclipse dice "la cláusula catch es inalcanzable".

Aquí es cuando trato de invocar myMethod en la clase MiClase :

270. myMethod.invoke(null, myParam); // NB : null because myMethod is static 

Cuando myMethod no lanza un MyCustomException, eveything está muy bien. Pero cuando se lanza una MyCustomException, me sale este mensaje de error:

Digamos que trato de invocar fooMethod(), que está en la clase BarClass() y:

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.tests.MyClass.test5(270) 
    at com.tests.MyClass.main(297) 
Caused by: com.tests.MyCustomException 
    at com.tests.barClass.fooMethod(BarClass.java:129) 
    ... 6 more 

¿Es posible? Gracias por la ayuda de todos modos.

+0

Parece que la invocación del método es una excepción. Rodearlo con try-catch. – Razvan

Respuesta

23

Puede obtener la causa que sería la excepción original.

InvocationTargetException.getCause(); 

De la documentación:

InvocationTargetException es una excepción comprobada que envuelve un excepción lanzada por un método o constructor invocado.

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

En el bloque catch, se puede comprobar si una excepción es del tipo que espera y lo maneja.

Un enfoque simple sería:

try { 
    ... 
} catch (InvocationTargetException ite) { 
    if (ite.getCause() instanceof SomeExceptionType) { 
     ... 
    } else { 
     ... 
    } 
} 
+0

¡Gracias! Funciona. Pero no puedo obtener el mensaje de MyCustomException, con 'getCause(). GetMessage()', incluso si creé MyCustomException de esta manera: 'new MyCustomException (" the message ")'. – cleroo

+0

Creo que esto podría deberse a su implementación específica, ¿podría depurar y verificar si la excepción realmente contiene el mensaje? –

+0

Tuve éxito con el modo de Marko Topolnik. Gracias de todos modos. – cleroo

1

Si está intentando agregar una cláusula catch en el método que se ejecuta myMethod.invoke(null, myParam), entonces eso no es obviamente la manera correcta de hacerlo. En este caso, está invocando el método a través de la reflexión y este no es el lugar para capturar la excepción, ya que el método invoke arroja otras excepciones. Una vez que invoque el método que arroja la excepción, si hay una excepción, se lanzará y envolverá en un InvocationTargetException, si no recuerdo mal.

Compruebe la última parte de this explanation referente al InvocationTargetException.

9

Una forma de hacerlo:

try { myMethod.invoke(null, myParam); } 
catch (InvocationTargetException e) { 
    try { throw e.getCause(); } 
    catch (MyCustomException e) { ...} 
    catch (MyOtherException e) { ...} 
} 
+0

+1 buen enfoque;) –

+0

De hecho, no funcionó::/ – cleroo

+0

Funciona. Fue mi culpa, en MyCustomException, el constructor no estaba configurado correctamente: ¡no pasé el mensaje! Error estúpido – cleroo

Cuestiones relacionadas