项目中的那些事---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反射方面的问题,有必要需要记录一下!

时间: 2024-10-10 18:08:08

项目中的那些事---Java反射的应用的相关文章

maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

本篇文章主要介绍了"maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener ",主要涉及到maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener 方面的内容,对于maven web 项目中启动报错jav

项目中的那些事---踩过的数据库坑

今天来说一下我在做项目时踩到的postgresql数据库的坑....... 数据库:postgresql 工具:Navicat 诱因:设置数据库表的主键为自动增长 之前做项目时数据库是别人设计的,我只操作数据库表.今天在navicat工具中创建数据表时想让主键(id)自动增长,就将id的类型设置成int2,因为我见别人的表中自动增长的字段类型都是int2, 不料在插入数据时却提示主键为空(主键一般都是非空),如下所示: 我就纳闷了,为什么别人设置成int2可以自动增长,我就不行.于是经过一番百度

项目中的那些事---PHP函数

总结工作中遇到的php函数: 1.查找:strpos("str", "substr"): 查找substr字符串在str字符串中出现的位置 第一个参数是:被查找的字符串 第二个参数是:要查找的字符串 1 $str = "my name is php"; 2 var_dump(strpos($str,"is")); 3 4 运行结果为: 5 int(8) 2.把字符串打散为字符:explode(' ','str'); 第一个参数

项目中的那些事---时间戳(一)

一.时间戳 简单讲,unix时间戳就是从1970-01-01开始所经过的秒数,什么时候获取时间戳,就是到那个时间点所经历的秒数. 二.JavaScript获取时间戳 根据时间戳的定义,可以使用javascript中的几个方法来获取系统当前的时间戳: 1.getTime() w3c school的解释如下: 根据上面的定义,我们可以获取系统当前的时间戳: var timeStamp1 = new Date().getTime(); console.info(timeStamp1);输出:15246

Java反射实战

一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1.Class类 Class类:Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class. 如何得到各个类的字节码即Class类呢? [1].类名.class:直接通过类.class获得. [2].对象.getClass():通过对象调用其getClass方法获得. [3]

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

[转载] Java反射机制的学习

本文转载自: http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Ja

Java反射机制专题

·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 ·Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任何一个对象的成员变量和方法 生成动态代理 ·反射相关的主要API: java.lang.Class:代表一个类 java.lang.refle

java反射概论

概述 JAVA反射机制是在运行状态中,对于任意一个类, 都能够知道这个类的所有属性和方法:对于任意一个对象, 都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Class Class是Reflection故事起源. 针对任何您想探勘的class,唯有先为它产生一个Class object, 接下来才能经由后者唤起为数十多个的Reflection APIs. 这些APIs将在稍后的探险活动中一一亮相. java反射概论