Java 配置化动态执行类方法

场景:配置化指标执行方案

业务系统配置一个任务,在任务中选中多个指标,执行对应的方法,将数据结果保存至数据库或者Redis

实例Bean的工具类

package com.dpxdata.backend.param;

import com.baomidou.mybatisplus.extension.exceptions.ApiException;
import com.dpxdata.backend.kbt.util.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.Map;

/**
 * @Author: lisaihang
 * @Date: 2021/3/19:14:15
 */
@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {


    private static ApplicationContext context;

    @Override
    @SuppressWarnings("static-access" )
    public void setApplicationContext(ApplicationContext contex)
            throws BeansException {
        // TODO Auto-generated method stub
        this.context = contex;
    }
    public static Object getBean(String beanName){
        return context.getBean(beanName);
    }

    public static Object getBean(Class cl){
        return context.getBean(cl);
    }

    public static String getMessage(String key) {
        return context.getMessage(key, null, Locale.getDefault());
    }

    /**
     * 执行动态方法,参数为map 方便实现对应业务
     * @param className 类路径
     * @param classMethod 方法
     * @param params map 参数 将需要的参数放入map中
     */
    public static void invoke(String className, String classMethod, Map<String, Object> params) {
        Class classN;
        try {
            classN = Class.forName(className);
            Object bean = SpringUtil.getBean(classN);
            for (Method method : classN.getMethods()) {
                if (classMethod.equals(method.getName())) {
                    log.info("Time Task  ==> 调用实现类{}, 执行时间 {}", className + "." + classMethod, DateUtils.getStrDate());
                    method.invoke(bean, params);
                    log.info("Time Task ==> 调用实现类结束{}, 执行时间 {}", className + "." + classMethod, DateUtils.getStrDate());
                    break;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new ApiException("反射实现类异常!");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new ApiException("拒绝访问该方法!");
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            throw new ApiException("执行方法异常!");
        }
    }
}

配置类

package com.dpxdata.backend.param;

import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Author: LiSaiHang
 * @Date: 2023/3/9 11:10 上午
 */
@Slf4j
@Component
public class RunService {
    public void run(Map<String, Object> params) {
        if (CollectionUtil.isNotEmpty(params)) {
           // 实际业务处理
           log.info(params.get("name").toString());
        }
    }
}

控制层测试 

/**
 * @Author: LiSaiHang
 * @Date: 2023/3/9 11:07 上午
 * {
 * 	"className": "com.dpxdata.backend.param.RunService",
 * 	"jsonParams": "{'name':'张三'}",
 * 	"methodName": "run"
 * }
 */
@RestController
public class ParamController {

    @PostMapping("/admin/run")
    public CommonResult<?> run(@RequestBody ParamModel entity) {
        SpringUtil.invoke(entity.getClassName(), entity.getMethodName(), JSON.parseObject(entity.getJsonParams(), HashMap.class));
        return CommonResult.success("执行成功");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值