Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 350|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-14 02:02:50 | 显示全部楼层 |阅读模式
     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 } 

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-2 06:50 , Processed in 0.054889 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表