• java动态调用方法并做了java.lang.reflect.InvocationTargetException 异常处理。


     1 package Test;
     2 
     3 import java.lang.reflect.InvocationTargetException;
     4 import java.lang.reflect.Method;
     5 
     6 public class PrivateUtil {
     7 /** 
     8 * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。 
     9 * 
    10 * @param clazz 
    11 * 目标类 
    12 * @param methodName 
    13 * 方法名 
    14 * @param classes 
    15 * 方法参数类型数组 
    16 * @return 方法对象 
    17 * @throws Exception 
    18 */ 
    19 public static Method getMethod(Class clazz, String methodName, 
    20 final Class[] classes) throws Exception { 
    21 Method method = null; 
    22 try { 
    23 method = clazz.getDeclaredMethod(methodName, classes); 
    24 } catch (NoSuchMethodException e) { 
    25 try { 
    26 method = clazz.getMethod(methodName, classes); 
    27 } catch (NoSuchMethodException ex) { 
    28 if (clazz.getSuperclass() == null) { 
    29 return method; 
    30 } else { 
    31 method = getMethod(clazz.getSuperclass(), methodName, 
    32 classes); 
    33 } 
    34 } 
    35 } 
    36 return method; 
    37 } 
    38 
    39 /** 
    40 * 
    41 * @param obj 
    42 * 调整方法的对象 
    43 * @param methodName 
    44 * 方法名 
    45 * @param classes 
    46 * 参数类型数组 
    47 * @param objects 
    48 * 参数数组 
    49 * @return 方法的返回值 
    50 * @throws Throwable 
    51 */ 
    52 public static Object invoke(final Object obj, final String methodName, 
    53 final Class[] classes, final Object[] objects) throws Throwable { 
    54 try { 
    55 Method method = getMethod(obj.getClass(), methodName, classes); 
    56 method.setAccessible(true);// 调用private方法的关键一句话 
    57 return method.invoke(obj, objects); 
    58 } catch (Exception e) { 
    59 if(e instanceof InvocationTargetException){ 
    60 Throwable throwable = ((InvocationTargetException) e).getTargetException(); //反射机制通常出现的的错误InvocationTargetException
    61 throw throwable; 
    62 }
    63 throw new RuntimeException(e); 
    64 } 
    65 } 
    66 
    67 public static Object invoke(final Object obj, final String methodName, 
    68 final Class[] classes) throws Throwable { 
    69 return invoke(obj, methodName, classes, new Object[] {}); 
    70 } 
    71 
    72 public static Object invoke(final Object obj, final String methodName) throws Throwable { 
    73 return invoke(obj, methodName, new Class[] {}, new Object[] {}); 
    74 } 
    75 
    76 }

    总结:最近在做一个java的动态调用方法,遇到了两个问题:

           一:私有方法的访问需要设置: method.setAccessible(true);

       二:当java动态调用方法的方法体里有异常抛出,都会被打包成InvocationTargetException异常类并抛出。 

         因此,在Catch(捕捉异常)的时候进行以下处理:

    1 try{
    2  //doXXX
    3 }catch (Exception e) { 
    4   if(e instanceof InvocationTargetException){ 
    5     Throwable throwable = ((InvocationTargetException) e).getTargetException(); //反射机制通常出现的的错误InvocationTargetException
    6     throw throwable; 
    7    }
    8   throw new RuntimeException(e); 
    9 } 
  • 相关阅读:
    使用pd从数据库逆向生成pdm文件
    js中的this指向
    js中的深浅拷贝
    使用eclipse遇到问题:the-package-collides-with-a-type
    电脑环境设置
    VIP
    win7操作技巧
    遍历Map的四种方法
    win7下安装tomcat
    Eclipse下快速打开本地文件的插件easy explore
  • 原文地址:https://www.cnblogs.com/Overbord/p/2838581.html
Copyright © 2020-2023  润新知