基于springcloud框架下的反射,动态执行类、方法
废话不多说,直接上代码
1、首先需要创建一个SpringApplicationContextUtil,用于动态获得实体Bean
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
/**
* @ClassName SpringApplicationContextUtil
* @Description 从Spring上下文取出Bean工具类
* @Version V1.0
**/
@Component
public class SpringApplicationContextUtil {
private static ApplicationContext applicationContext = null;
public static void setApplicationContext(ApplicationContext applicationContext) {
if (SpringApplicationContextUtil.applicationContext == null) {
SpringApplicationContextUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
2、然后在服务启动类中初始化ApplicationContext ,:
@SpringBootApplication
public class BigDataSupervisionApplication {
public static void main(String[] args) {
ApplicationContext run = SpringApplication.run(BigDataSupervisionApplication.class, args);
SpringApplicationContextUtil.setApplicationContext(run);
}
}
3、操作代码:
/**
* 启动接口信息
* @return
*/
@DeleteMapping("/extractInterfaceClassification/{boj}/{methodIn}")//boj是前台传过来的类名,methodIn方法名
public RetResult extractInterfaceClassification(@PathVariable String boj,@PathVariable String methodIn){
// 封装结果数据
RetResult retResult = new RetResult();
try{
//这里boj为String类型,需要先拿到所在类的路径类初始化object,若传过来的是一个类对象则不需要此步骤,直接getBean
Object obj=Class.forName("com.success.data.controller." + boj).newInstance();
Object service = SpringApplicationContextUtil.getBean(obj.getClass());//matInfoMapper
Class<? extends Object>[] paramClass = null;
paramClass = null;
// 找到方法
Method method = ReflectionUtils.findMethod(service.getClass(), methodIn.trim(), paramClass);
// 执行方法
ReflectionUtils.invokeMethod(method, service);
}catch(Exception e){
e.printStackTrace();
return RetResponse.successRsp(null,"启动失败");
}
return RetResponse.successRsp(null,"启动成功");
}