JAVA Spring 反射调用包含依赖注入的方法样例

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为自定义异常处理封装类。这些实际使用请除以(找不到这些方法的)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值