Как вызвать метод, который генерирует исключение с использованием 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
.