Java反射在实际工作中的应用笔记

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

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

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

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

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

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

/**
   * 判断方法是否存在
   *
   * @param obj JObjectService实例
   * @param methodName 方法名称
   * @param paraTypes 方法形参类型数组
   * @return
   */
  public static boolean judgeMethodIsExist(Object obj, String methodName, Class[] paraTypes) {
    boolean result = true;
    try {
      if (null != obj) {
        Method method = obj.getClass().getMethod(methodName, paraTypes);
      }
    } catch (NoSuchMethodException ex) {
      showWarnInfo(ex.toString());
      log.error("异常发生在:" + MainJFrame.hostName + ";详细信息为:" + ex.getMessage());
      result = false;
    }
    return result;
  }

参数介绍:

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

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

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

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

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

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

以上代码中:

第一行:调用方法createBucket方法的对象sysUser

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

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

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

第六行:获取该对象的Class

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

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

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

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

总结

以上就是本文关于Java反射在实际工作中的应用笔记的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java反射简易教程

关于Java反射机制 你需要知道的事情

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Java反射之Call stack introspection详解

    java是基于栈设计的语言,其实与C.C++语言相同.整个程序的运行表现在方法的执行是一系列入栈出栈的行为,栈是线程私有的. 在java语言中,我们可以跟踪方法的调用关系,即当前栈帧(栈顶)和已经入栈的栈帧的层次关系. 从java1.4以后,java语言的Throwable类提供了以下方法: OpenDeclarationStackTraceElement[]java.lang.Throwable.getStackTrace() Providesprogrammaticaccesstothest

  • Java反射简易教程

    关于Java反射,我们需要弄懂以下几个问题: 反射是什么?反射有什么用?怎么用反射? 下面我们来一一进行讲解: 一.反射是什么? Reflection的意思是"反射.映象.倒影",用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods. Java反射机制是在运行状态中,对于任意一个

  • 通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并实现委托方法 //添加一个静态方法委托,返回整型值ID代表该方法与参数构成的实例.若失败,则返回-1. public synchronized int addFunctionDelegate(Class<?> srcClass,String methodName,Object... params)

  • Java利用反射获取object的属性和值代码示例

    在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. referance:Java反射简易教程 import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 反射处理Bean,得到里面的属性值 * * @author liulinsen * */ publ

  • Java反射机制概念、原理与用法总结

    本文实例讲述了Java反射机制概念.原理与用法.分享给大家供大家参考,具体如下: 反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射机制能做什么 反射机制主要提供了以下功能: ① 在运行时判断任意一个对象所属的类: ② 在运行时构造任意一个类的对象: ③ 在运行时判断任意一个类所具有的成员变量和方法: ④ 在运行时调用任意一个

  • java反射获取和调用方法

    Class类中获取方法: public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法--Method不支持泛型<>,即后面不接<> public Method[] getDeclaredMethods();//获取自身所有的方法(private.public.protected,和访问权限无关),不包括继承的 在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法 对于Me

  • Java反射机制实例代码分享

    本文旨在对Java反射机制有一个全面的介绍,希望通过本文,大家会对Java反射的相关内容有一个全面的了解. 阅读本文之前,大家可先行参阅<重新理解Java泛型>. 前言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题.本文我们就从实际应用的角度出发,来应用一下Java的反射机制. 反射

  • java反射获取一个object属性值代码解析

    有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: private class User { String userName; String userPassword; public String getUserName() { return userName; } public void setUserName(String userName) { this.

  • Java反射在实际工作中的应用笔记

    最近工作中遇到一个这样的问题: 为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本. 于是就引入了这样一个问题: 有些接口如果在部分版本中不存在,那么通过界面执行这个操作的时候就会报错,所以为了兼容所有版本,就要在方法调用之前考虑方法是否存在,同时为了不在编译时抛异常,在调用方法时 也需要通过反射来调用,具体实现如下: 一.使用反射判断方法是否存在 /** * 判断方法是否存在 * * @param

  • java反射_改变private中的变量及方法的简单实例

    java反射_改变private中的变量及方法的简单实例 class DemoTest{ private String name="123"; public getName(){ system.out.println("public getName " + name); return name; } private getName2(){ system.out.println("private getName2 " + name); return

  • Java反射,泛型在Json中的运用

    最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的框架中也能看到它的身影,可以在运行时检查类,接口.变量和方法等信息,可以实例化调用方法以及设置变量值等.本文主要以代码的形式直接将反射,泛型的运用展现出来. java中的反射 首先新建一个基础类Author. package bean; /** * * @author Super~me * Desc

  • Java各种锁在工作中使用场景和细节经验总结

    目录 1.synchronized 1.1.共享资源初始化 2.CountDownLatch 2.1.场景 2.2.实现 3.总结 1.synchronized synchronized 是可重入的排它锁,和 ReentrantLock 锁功能相似,任何使用 synchronized 的地方,几乎都可以使用 ReentrantLock 来代替,两者最大的相似点就是:可重入 + 排它锁,两者的区别主要有这些: ReentrantLock 的功能更加丰富,比如提供了 Condition,可以打断的加

  • Java 反射机制原理与用法详解

    本文实例讲述了Java 反射机制原理与用法.分享给大家供大家参考,具体如下: 反射反射,程序员的快乐! 1.什么是反射? Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是

  • Effective Java 在工作中的应用总结

    目录 一  创建和销毁对象篇 1  若有多个构造器参数时,优先考虑构造器 2  通过私有构造器强化不可实例化的能力 二  类和接口篇 1  最小化类和成员的可访问性 2  使可变形最小化 三  泛型篇 1  列表优先于数组 四  方法篇 1  校验参数的有效性 2  谨慎设计方法签名 3  返回零长度的数组或者集合,而不是null 五  通用程序设计篇 1  如果需要精确的答案,请避免使用float和double 2  基本类型优先于装箱基本类型 六  异常 1  每个方法抛出的异常都要有文档

  • 分享几个Java工作中实用的代码优化技巧

    目录 1.类成员与方法的可见性最小化 2.使用位移操作替代乘除法 3.尽量减少对变量的重复计算 4.不要捕捉RuntimeException 5.使用局部变量可避免在堆上分配 6.减少变量的作用范围 7.懒加载策略 8.访问静态变量直接使用类名 9.字符串拼接使用StringBuilder 10.重写对象的HashCode 11.HashMap等集合初始化 12.循环内创建对象引用 13.遍历Map 使用 EntrySet 方法 14.不要在多线程下使用同一个 Random 15.自增推荐使用L

  • 在实践中了解Java反射机制应用

    引言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题.本文我们就从实际应用的角度出发,来应用一下Java的反射机制. 反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先

  • Java工作中常见的并发问题处理方法总结

    问题复现 1. "设备Aの奇怪分身" 时间回到很久很久以前的一个深夜,那时我开发的多媒体广告播放控制系统刚刚投产上线,公司开出的第一家线下生鲜店里,几十个大大小小的多媒体硬件设备正常联网后,正由我一台一台的注册及接入到已经上线的多媒体广告播控系统中. 注册过程简述如下: 每一个设备注册到系统中后,相应的在数据库设备表中都会新增一条记录,来存储这个设备的各项信息. 本来一切都有条不紊的进行着,直到设备A的注册打破了这默契的宁静-- 设备A注册完成后,我突然发现,数据库设备表中,新增了两条

随机推荐