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

在日常开发过程当中,我们有时候会通过去获取某一个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
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值