在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题。spring中提供了ReflectionUtils

这个反射的工具类,如果项目使用spring框架的话,使用这个工具可以简化反射的开发工作。

我们的目标是根据bean的名称、需要调用的方法名、和要传递的参数来调用该bean的特定方法。

下面直接上代码:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. import org.springframework.util.ReflectionUtils;
  4.  
  5. import java.lang.reflect.Method;
  6.  
  7. /**
  8. * Created with IntelliJ IDEA.
  9. * User: 焦一平
  10. * Date: 2015/6/15
  11. * Time: 18:22
  12. * To change this template use File | Settings | File Templates.
  13. */
  14. @Service
  15. public class ReInvokeService {
  16. @Autowired
  17. private SpringContextsUtil springContextsUtil;
  18.  
  19. public void reInvoke(String beanName,String methodName,String[] params){
  20. Method method = ReflectionUtils.findMethod(springContextsUtil.getBean(beanName).getClass(), methodName, String.class, String.class, Boolean.class,String.class);
  21. Object[] param1 = new Object[3];
  22. param1[0]=params[0];
  23. param1[1]=params[1];
  24. param1[2]=true;
  25. ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param1);
  26. }
  27. }
  1. ReflectionUtils.findMethod()方法的签名是这样的:
  1. public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
    依次需要传入 class对象、方法名、参数类型
  1. SpringContextsUtil 这个工具类实现了 ApplicationContextAware接口,可以访问ApplicationContext的相关信息,代码如下:
  1. import org.springframework.beans.BeansException;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.ApplicationContextAware;
  4. import org.springframework.stereotype.Component;
  5.  
  6. /**
  7. * Created with IntelliJ IDEA.
  8. * User: 焦一平
  9. * Date: 2015/6/15
  10. * Time: 18:36
  11. * To change this template use File | Settings | File Templates.
  12. */
  13. @Component
  14. public class SpringContextsUtil implements ApplicationContextAware {
  15.  
  16. private ApplicationContext applicationContext;
  17.  
  18. public Object getBean(String beanName) {
  19. return applicationContext.getBean(beanName);
  20. }
  21.  
  22. public <T> T getBean(String beanName, Class<T> clazs) {
  23. return clazs.cast(getBean(beanName));
  24. }
  25. @Override
  26. public void setApplicationContext(ApplicationContext applicationContext)
  27. throws BeansException {
  28. this.applicationContext = applicationContext;
  29. }
  30. }
  1.  

使用spring提供的ReflectionUtils简化项目中反射代码的复杂性的更多相关文章

  1. Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明

    Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...

  2. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...

  3. [git]安装git-pylint-commit-hook提高python项目中的代码质量

    什么是'git-pylint-commit-hook' 我在工作中,团队为了保证代码和提高代码的质量,要求每个项目都要求安装git-pylint-commit-hook,它是个钩子,会在你提交代码到本 ...

  4. 吐槽一下项目中的代码坏味道:滥用java常量

    我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...

  5. 最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来

    package com.example.home; import java.io.IOException; import java.io.InputStream; import javax.micro ...

  6. 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享

    1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...

  7. 使用eslint将项目中的代码修改统一的缩进

    背景 继承了组里师兄师姐写的项目的前端代码,但是是两个人写的,有两格缩进的,有四格缩进的,有字符串外用单引号的,有用双引号的. 于是搜索了一下,可以用eslint强制转化. eslint在github ...

  8. Spring JdbcTemplate详解及项目中的运用

    1.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...

  9. 使用 Lombok 简化项目中无谓的Java代码

    在写使用Java时,难免会有一些模板代码要写,不然get/set,toString, hashCode, close 资源,定义构造函数等等.代码会显得很冗余,很长.Lombok项目可以是我们摆脱这些 ...

随机推荐

  1. 树莓派命令行配置连接wifi

    iwlist scan sudovim /etc/wpa_supplicant/wpa_supplicant.conf   network={   ssid="WIFINAME" ...

  2. Thinkphp5 runtime路径设置data

    路径设置 index.php // runtime文件路径define('RUNTIME_PATH', __DIR__ . '/data/runtime/');

  3. storm学习之六-使用Maven 生成jar包多种方式

    Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  4. MongoDB的php可视化管理工具

    使用MongoDB命令查看很不方便 于是想把爬来的数据导出来,看爬来的数据是否正确 打开cmd,执行 mongoexport -d test -c blogs --csv -f title,link, ...

  5. 用Python写简单的爬虫

    准备: 1.扒网页,根据URL来获取网页信息 import urllib.parse import urllib.request response = urllib.request.urlopen(& ...

  6. Python中MongoDB使用

    MongoDB的层级为 database -->collection --> document 安装MongoDB,启动mongo服务 PyMongo模块是Python对MongoDB操作 ...

  7. C++ 保存Excel文件(带密码保护)

    最近有客户需求报表保存为xls的功能,需要保存的文件设置密码保护,特进行尝试! Workbook.SaveAs method (Excel) 参数详情:https://docs.microsoft.c ...

  8. 详解js中的apply与call的用法

    前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...

  9. mysql asyn 实战

    创建configuration时,发现URLParser找不到,于是只能使用配置文件来,当然使用配置文件比使用URL初始化还要直观些 def configurationWithPassword = n ...

  10. 扩展方法(DateTableToList)

    public static IList<T> ToList<T>(this DataTable dt) where T : class,new() { var prlist = ...