您现在的位置是:首页 > 正文

java 反射获取bean、执行指定方法。

2024-01-30 23:00:55阅读 0

在日常开发过程当中,我们有时候会通过去获取某一个bean名称,从而去执行其当中的某个方法。
比如这个bean实现了某个接口,重写了某个方法。

下面是代码示例:

1、SpringContextUtil

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtil implements ApplicationContextAware {


    // 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicationContext.
    private static ApplicationContext applicationContext;


    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 获取spring上下文
     */
    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }
    /**
     * 获取bean
     * @return object bean的实例对象
     */
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

}

2、controller层当中,定义两个方法。

(当然这个类中你可以多定义几个方法,太多就不贴上来了)

 @GetMapping("/reflect.do")
 @ApiOperation(value = "反射获取bean")
 @ApiImplicitParams({@ApiImplicitParam(name = "beanName", value = "bean的名称", required = true),
            @ApiImplicitParam(name = "methodName", value = "方法名称", required = true)})
    public String reflect(String beanName, String methodName)
    {
        // 反射方式获取对象
        Object object = SpringContextUtil.getBean(beanName);
        // 获取方法
        Method method = ReflectionUtils.findMethod(object.getClass(), methodName);

        Method[] allDeclaredMethods = ReflectionUtils.getDeclaredMethods(object.getClass());

        for (Method allDeclaredMethod : allDeclaredMethods) {
            System.out.println(allDeclaredMethod.getName());
        }

        // 调用方法
        Object o = ReflectionUtils.invokeMethod(method, object);
        return o.toString();
    }
    
 	public String test()
    {
        return "测试反射";
    }

3、启动项目 调用接口 测试。

调用reflect.do接口,beanName是我这个类的名称,methodName是类当中某个方法的名称。
可以看到,通过反射获取到当中类对象之后,调用了test方法,并返回了数据。

在这里插入图片描述

此外,说一下两个方法

ReflectionUtils.getAllDeclaredMethods(object.getClass());
ReflectionUtils.getDeclaredMethods(object.getClass()); 

这两个方法,都是获取类的方法信息的方法。区别在于:
前者获取指定类及其所有父类的所有方法
后者只获取指定类中声明的方法

调用这两个方法之后,分别打印出来的方法如下图所示:

第一张图对应getAllDeclaredMethods
第二张图对应getDeclaredMethods
在这里插入图片描述

在这里插入图片描述

网站文章

  • 联软科技产品「准入」存在任意文件上传和命令执行漏洞

    联软科技产品「准入」存在任意文件上传和命令执行漏洞

    1、准入系统概述网络准入这一概念是由思科发起、后续由华为、联软、北信源等多家厂商根据此概念,基于在NACC、802.1x、EOU、WebAuth、MAB、IAB的基础上进行自主研发的一门新兴技术。其宗...

    2024-01-30 23:00:48
  • Linux 桌面系统开机自动启动

    桌面脚本文件编写:[Desktop Entry]Version=1.0Type=ApplicationTerminal=falseExec=/test/test.shName=TestIcon=/test/test.ico文件名为test.desktop存放路径为:cp -rf test.desktop /root/.config/autostart/.

    2024-01-30 23:00:41
  • 蓝牙协议分析(7)_BLE连接有关的技术分析

    蓝牙协议分析(7)_BLE连接有关的技术分析

    1. 前言了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connection)是一个相当消耗资源(power和带宽)的过程。特别是当没有数据传输的时候,所消耗的资源完全被浪费了。因而,对很多蓝牙设备来说...

    2024-01-30 23:00:16
  • 判断字符串是否是数字HTML,jquery怎么判断字符串是否为数字?

    判断字符串是否是数字HTML,jquery怎么判断字符串是否为数字?

    jquery判断字符串是否为数字的方法:1、使用isNaN()函数判断var val = $("#test").val();var ival = parseInt(val);//如...

    2024-01-30 23:00:08
  • python爬虫分享

    python爬虫分享

    1、爬取网站:、项目说明:根据model进行分类,model下面有图集,图集下面是图片3、使用依赖:4、代码:(注意:下载图片有反爬虫,①需要添加headers,②模拟浏览器操作注意随机sleep)提示:爬完之后注意检查一下是否爬取完毕,哪个文件夹里面不对,就把它删除之后,重新跑程序,之前爬取的不会再爬取。............

    2024-01-30 23:00:01
  • May Day Holiday

    As a university advocating self-learning and work-rest balance, Marjar University has so many days of rest, including holidays and weekends. Each weekend, which consists of Saturday and Sunday, is a

    2024-01-30 22:59:52
  • Java集合源码浅析(一) : ArrayList

    Java集合源码浅析(一) : ArrayList

    (尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/105317442冷血之心的博客) 背景 一直都有这么一个打算,那...

    2024-01-30 22:59:23
  • nodejs 开发环境配置-快速切换node版本、npm包源以及热启动

    nodejs 开发环境配置-快速切换node版本、npm包源以及热启动

    nodejs 开发环境配置 快速切换npm版本node版本淘宝镜像

    2024-01-30 22:59:15
  • SpringCloudAlibaba系列微服务搭建笔记一_Nacos

    SpringCloudAlibaba系列微服务搭建笔记一_Nacos

    Spring Cloud 本身并不是一个拿来即用的框架,而是一套规范。主流的 Spring Cloud Netfix 和 Spring Cloud Alibaba 实现了这一套规范微服务常用技术栈:由...

    2024-01-30 22:59:08
  • ffmpeg moov 前移命令

    ffmpeg -i ./old.mp4 -movflags faststart -c copy new.mp4

    2024-01-30 22:58:40