在日常开发过程当中,我们有时候会通过去获取某一个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