Как вызвать метод, который генерирует исключение с использованием Java Reflection?

Я хотел бы вызвать метод, используя Java Reflection.

Проблема в том, что этот метод (который я написал) генерирует исключение (я создал myCustomException). Когда я добавляю предложение try/catch, я не могу запустить свой проект, потому что Eclipse говорит, что "предложение catch недоступно".

Вот когда я пытаюсь вызвать myMethod в классе MyClass:

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

Когда myMethod не бросает MyCustomException, все в порядке. Но когда он бросает MyCustomException, я получаю это сообщение об ошибке:

Скажем, я пытаюсь вызвать fooMethod(), который находится в классе BarClass() и:

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

Возможно ли это? Спасибо за помощь в любом случае.

Ответы

Ответ 1

Вы можете получить причину этого, которая была бы исходным исключением.

InvocationTargetException.getCause();

Из документации:

InvocationTargetException - это исключенное исключение, которое обертывает исключение, вызванное вызываемым методом или конструктором.

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

В вашем блоке catch вы можете проверить, не является ли исключение из того типа, который вы ожидаете, и обрабатывать его.

Один простой подход:

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

Ответ 2

Один из способов сделать это:

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

Ответ 3

Если вы пытаетесь добавить предложение catch в методе, который выполняет myMethod.invoke(null, myParam), то это, очевидно, не правильный способ его выполнения. В этом случае вы вызываете метод посредством отражения, и это не то место, где нужно ловить исключение, так как метод invoke выдает другие исключения. Когда вы вызываете метод, который генерирует исключение, если есть исключение, он будет вызван и завернут в InvocationTargetException, если я правильно напомню.

Проверьте последнюю часть это объяснение относительно InvocationTargetException.