一. 调用service类
  1. 工具类
package com.gracechain.orientaleagle.domain.notification.util;

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.util.Map;

/****************************************************
 *
 * Spring Context 相关工具类
 *
 *
 * @author lrd
 * @version 1.0
 **************************************************/
@Component
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }

    public static <T> T getBean(String beanName) {
        if(applicationContext.containsBean(beanName)){
            return (T) applicationContext.getBean(beanName);
        }else{
            return null;
        }
    }

    public static <T> Map<String, T> getBeansOfType(Class<T> baseType){
        return applicationContext.getBeansOfType(baseType);
    }

    //测试类  可删除
    public String test(String str){
        System.out.println(">>>>>>>>>>>>>");
        return str;
    }
}
  1. 配置属性 这里只配置了类名 方法名同样
    在这里插入图片描述
  2. 调用的service
    在这里插入图片描述
  3. 调用
package com.gracechain.orientaleagle.domain.notification.util;

import com.gracechain.orientaleagle.domain.notification.constant.SmsTemplate;
import com.gracechain.orientaleagle.domain.system.entity.LocalUserEntity;
import io.lettuce.core.dynamic.support.ReflectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 根据配置文件 动态获取短信接口service
 * 执行发送方法
 */
@Slf4j
@Component
public class SendSmsNotification {

    //根据配置文件获取短信接口service
    @Value("${sendsms.serviceName}")
    public String serviceName;

    //方法名 
    private String methodName = "sendSmsNotification";

    //方法的参数类型
    private Class param1 = com.gracechain.orientaleagle.domain.system.entity.LocalUserEntity.class;
    private Class param2 = com.gracechain.orientaleagle.domain.notification.constant.SmsTemplate.class;
    private Class param3 = java.lang.Object.class;


    /**
     * 获取service 并执行发送方法
     */
    public Object sendSms(LocalUserEntity localUser, SmsTemplate templateCode, Object templateParam){

        Object result = null;
        try {
            // 获取service
            Object service = SpringUtils.getBean(serviceName);

            //查看内部方法 可删除
            Method[] methods = service.getClass().getDeclaredMethods();
            for (Method m : methods) {
                System.out.println(m);
            }
            System.out.println("----------------------");

            // 传递需要执行的方法
            Method method = ReflectionUtils.findMethod(service.getClass(), methodName, param1, param2, param3);
            // 调用的方法有多个参数  Method method = classzz.getMethod("class1method",long.class,String.class,String.class);
            // 如果调用的方法有参数 invoke(o,param1,param2,param3,...)
            result = ReflectionUtils.invokeMethod(method, service, localUser, templateCode, templateParam);
            
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

//具体调用 注入后直接调用即可

  @Autowired
  private SendSmsNotification sendSmsNotification;
sendSmsNotification.sendSms(user, SmsTemplate.ALTER, null);

在这里插入图片描述

普通类

直接获取class后执行即可

Object result = null;
        try {
            // 包名+类名    (工具类中的测试方法)
            Class classzz = Class.forName("com.gracechain.orientaleagle.domain.notification.util.SpringUtils");
            
            Method method = ReflectionUtils.findMethod(classzz,"test", java.lang.String.class);
            result = ReflectionUtils.invokeMethod(method, classzz.newInstance(), "22222");
            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐