java.lang.reflect.InvocationTargetException
程序员文章站
2024-01-10 15:33:22
...
在通过反射执行方法的时,如Method.invoke(),当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收,这个异常会被包装成InvocationTargetException重新抛出.
TEST:
点击打开链接
点击打开链接
比如方法抛出了org.springframework.jdbc.BadSqlGrammarException,则Method.invoke方法抛出的是InvocationTargetException,而不是 BadSqlGrammarException,必须要提取它的TargetException重新抛出才行.
org.apache.commons.lang.StringUtils
org.springframework.context.ApplicationContext
java.lang.reflect.Method
java.lang.Throwable
public Object invokeMethod(String subscriber,String params) {
String managerName = StringUtils.substringBefore(subscriber.trim(),".");;
String methodName = StringUtils.substringAfter(subscriber.trim(),".");
Object manager = applicationContext.getBean(managerName);
Object obj = null;
String message = "";
try {
Method method = manager.getClass().getMethod(methodName, new Class[]{String.class});
obj = method.invoke(manager,new Object[]{params});
}
catch (IllegalArgumentException e) {
throw new BusinessException(e.getMessage());
} catch (SecurityException e) {
throw new BusinessException(e.getMessage());
} catch (IllegalAccessException e) {
throw new BusinessException(e.getMessage());
} catch (InvocationTargetException e) {
Throwable targetEx = ((InvocationTargetException) e)
.getTargetException();
if (targetEx != null){
message = targetEx.getMessage();
}else{
message = e.getMessage();
}
throw new BusinessException(message);//e.getCause()
} catch (NoSuchMethodException e) {
throw new BusinessException(e.getMessage());
}catch (Exception e) {
throw new BusinessException(e.getMessage());
}
return obj;
}
package com.test.reflect;
public class Reflect {
public void run(int j) throws BusinessException {
BOL b = new BOL();
b.run(i);
}
}
class BOL {
public void run(int j) throws BusinessException {
if (j < 0) {
throw new BusinessException("参数不能小于零!");
}
}
}
class BusinessException extends Exception {
private static final long serialVersionUID = 1L;
private String message;
public BusinessException(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
TEST:
package com.test.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("com.test.reflect.Reflect");
Method method = clazz.getMethod("run", int.class);
method.invoke(clazz.newInstance(), -1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();// 获取目标异常
t.printStackTrace(); //重新抛出
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
点击打开链接
点击打开链接
推荐阅读
-
java.lang.reflect.InvocationTargetException
-
json数据转换异常之 java.lang.reflect.InvocationTargetException
-
java.lang.reflect.InvocationTargetException
-
异常: java.lang.reflect.InvocationTargetException 反射异常
-
java.lang.reflect.InvocationTargetException
-
java.lang.reflect.InvocationTargetException(反射异常)异常
-
java.lang.reflect.InvocationTargetException
-
java.lang.reflect.InvocationTargetException
-
Caused by: java.lang.reflect.InvocationTargetException
-
java.lang.reflect.InvocationTargetException at shade.com.datastax.spark.connector.google.common.base.Throwables.propagate(Throwables.java160)