Spring 反射调用包含依赖注入的方法样例
什么都不说直接上代码
public class BackRequestServiceImpl implements ApplicationContextAware {
@Autowired
private ServiceConduitService serviceConduitService;
private ApplicationContext applicationContext;
public ApiResultRule execute(ApiParamRule apiParamRule) {
//获取数据库中存储的方法完整地址例如:com.codeyi.demo.getName
ServiceConduit serviceConduit = serviceConduitService.selectByServiceCode(apiParamRule.getApiCode());
if (serviceConduit == null) {
log.error("APP请求接口编号:{},未找到定义的接口", apiParamRule.getApiCode());
return ApiResultRuleUtil.buildBackStageErrorResult(BackStageErrorCodeEnum.NoSuchMethodException);
}
try {
//反射调用指定类的指定方法
//Codeyi提醒你:类的参数(String)及返回值(ApiResultRule)一定要统一不然会传参失败
String className = serviceConduit.getServiceAddress().substring(0, serviceConduit.getServiceAddress().lastIndexOf("."));
//找到实现类
Class clazz = Class.forName(className);
//找到Spring容器中类对应的bean
Object object = applicationContext.getBean(clazz);
//拆分方法名
String methodName = serviceConduit.getServiceAddress().substring(serviceConduit.getServiceAddress().lastIndexOf(".") + 1);
//执行bean中的方法
Method method = object.getClass().getMethod(methodName, new Class[]{String.class});
ApiResultRule result = (ApiResultRule) method.invoke(object, apiParamRule.getParamData() == null ? StringUtil.EMPTY_STRING : apiParamRule.getParamData());
return result;
} catch (ClassNotFoundException cnfe) {
log.error("APP请求接口编号:{},未找到定义的类地址:{}", apiParamRule.getApiCode(), serviceConduit.getServiceAddress());
return ApiResultRuleUtil.buildBackStageErrorResult(BackStageErrorCodeEnum.ClassNotFoundException);
} catch (NoSuchMethodException nse) {
log.error("APP请求接口编号:{},未找到定义的接口地址:{}", apiParamRule.getApiCode(), serviceConduit.getServiceAddress());
return ApiResultRuleUtil.buildBackStageErrorResult(BackStageErrorCodeEnum.NoSuchMethodException);
} catch (InvocationTargetException ite) {
log.error("APP请求接口编号:{},反射异常的接口地址:{}", apiParamRule.getApiCode(), serviceConduit.getServiceAddress());
return ApiResultRuleUtil.buildBackStageErrorResult(BackStageErrorCodeEnum.InvocationTargetException);
} catch (IllegalAccessException iae) {
log.error("APP请求接口编号:{},反射安全权限异常的接口地址:{}", apiParamRule.getApiCode(), serviceConduit.getServiceAddress());
return ApiResultRuleUtil.buildBackStageErrorResult(BackStageErrorCodeEnum.IllegalAccessException);
}
}
注意:ApiParamRule与ApiResultRule为自定义的参数及返回值Model,apiResultRuleUtil为自定义异常处理封装类。这些实际使用请除以(找不到这些方法的)