zoukankan      html  css  js  c++  java
  • 项目中的那些事---Java反射的应用

    最近工作中遇到一个这样的问题:

    为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本。

    于是就引入了这样一个问题:

    有些接口如果在部分版本中不存在,那么通过界面执行这个操作的时候就会报错,所以为了兼容所有版本,就要在方法调用之前考虑方法是否存在,同时为了不在编译时抛异常,在调用方法时

    也需要通过反射来调用,具体实现如下:

    一、使用反射判断方法是否存在

     1 /**
     2      * 判断方法是否存在
     3      *
     4      * @param obj JObjectService实例
     5      * @param methodName 方法名称
     6      * @param paraTypes 方法形参类型数组
     7      * @return
     8      */
     9     public static boolean judgeMethodIsExist(Object obj, String methodName, Class[] paraTypes) {
    10         boolean result = true;
    11         try {
    12             if (null != obj) {
    13                 Method method =  obj.getClass().getMethod(methodName, paraTypes);
    14             }
    15         } catch (NoSuchMethodException ex) {
    16             showWarnInfo(ex.toString());
    17             log.error("异常发生在:" + MainJFrame.hostName + ";详细信息为:" + ex.getMessage());
    18             result = false;
    19         }
    20         return result;
    21     }

    参数介绍:
    (1)obj:表示调用某个方法的对象

    (2)methodName:要调用的方法名称

    (3)paraTypes:方法所需的参数类型(多个时为数组)

    通过这个方法,就可以判断你通过obj对象调用的methodName(参数类型为)方法是否存在,如果不存在就会跑NoSuchMethodException异常

    二、通过反射调用方法,避免编译时异常

     1         sysUser = MainJFrame.getSysUser();
     2         Class[] paramObj = {String.class, long.class, String.class, String.class, int.class};
           //判断方法是否存在
    3 boolean isExist = CommonUtil.judgeMethodIsExist(sysUser, "createBucket", paramObj); 4 if (isExist) { 5 try {
                //通过反射调用方法
    6 Class clazz = sysUser.getClass();
                //方法名称--方法中参数的类型(按参数顺序)
    7 Method createBucket = clazz.getDeclaredMethod("createBucket",String.class, long.class, String.class, String.class, int.class); 8 int create = (int) createBucket.invoke(sysUser,bucketName, Long.parseLong(bucketSize), bucketLoc, bucketAcl, Integer.parseInt(StringUtil.emptyToZero(bucketCycle))); 9 if (create == 1) { 10 CommonUtil.showInfo("Bucket创建成功"); 11 log.info("Bucket创建成功"); 12 } else { 13 CommonUtil.showWarnInfo("Bucket创建失败,服务器内部错误!"); 14 log.info("Bucket创建失败,服务器内部错误"); 15 } 16 } catch (Exception ex) { 17 CommonUtil.showWarnInfo(ex.getMessage()); 18 log.error("异常发生在:" + MainJFrame.hostName + ";详细信息为:" + ex.getMessage()); 19 } 20 }

    以上代码中:
    第一行:调用方法createBucket方法的对象sysUser

    第二行:方法中的参数类型数组,在判断方法是否存在时用

    第三行:通过对象、方法名和参数类型数组判断方法是否存在

    通过以上三行,方法存在时会执行下面的任务,不存在是则会提示异常信息

    第六行:获取该对象的Class

    第七行:获取对象的方法Method对象,参数为方法名称和参数对应的类型

    第八行:通过Method对象反射调用createBucket方法,参数分别是sysUser对象和需要的参数(值)

    通过以上方法,即使对象中的某个接口不存在时也不会出现编译时异常。

     讲真,这是第一次在自己的项目中遇到Java反射方面的问题,有必要需要记录一下!

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/hellowhy/p/7768202.html
Copyright © 2011-2022 走看看