123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package com.ruoyi.quartz.util;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.LinkedList;
- import java.util.List;
- import com.ruoyi.common.utils.StringUtils;
- import com.ruoyi.common.utils.spring.SpringUtils;
- import com.ruoyi.quartz.domain.SysJob;
- /**
- * 任务执行工具
- *
- * @author ruoyi
- */
- public class JobInvokeUtil
- {
- /**
- * 执行方法
- *
- * @param sysJob 系统任务
- */
- public static void invokeMethod(SysJob sysJob) throws Exception
- {
- String invokeTarget = sysJob.getInvokeTarget();
- String beanName = getBeanName(invokeTarget);
- String methodName = getMethodName(invokeTarget);
- List<Object[]> methodParams = getMethodParams(invokeTarget);
- if (!isValidClassName(beanName))
- {
- Object bean = SpringUtils.getBean(beanName);
- invokeMethod(bean, methodName, methodParams);
- }
- else
- {
- Object bean = Class.forName(beanName).newInstance();
- invokeMethod(bean, methodName, methodParams);
- }
- }
- /**
- * 调用任务方法
- *
- * @param bean 目标对象
- * @param methodName 方法名称
- * @param methodParams 方法参数
- */
- private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
- throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
- InvocationTargetException
- {
- if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
- {
- Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
- method.invoke(bean, getMethodParamsValue(methodParams));
- }
- else
- {
- Method method = bean.getClass().getDeclaredMethod(methodName);
- method.invoke(bean);
- }
- }
- /**
- * 校验是否为为class包名
- *
- * @param invokeTarget 名称
- * @return true是 false否
- */
- public static boolean isValidClassName(String invokeTarget)
- {
- return StringUtils.countMatches(invokeTarget, ".") > 1;
- }
- /**
- * 获取bean名称
- *
- * @param invokeTarget 目标字符串
- * @return bean名称
- */
- public static String getBeanName(String invokeTarget)
- {
- String beanName = StringUtils.substringBefore(invokeTarget, "(");
- return StringUtils.substringBeforeLast(beanName, ".");
- }
- /**
- * 获取bean方法
- *
- * @param invokeTarget 目标字符串
- * @return method方法
- */
- public static String getMethodName(String invokeTarget)
- {
- String methodName = StringUtils.substringBefore(invokeTarget, "(");
- return StringUtils.substringAfterLast(methodName, ".");
- }
- /**
- * 获取method方法参数相关列表
- *
- * @param invokeTarget 目标字符串
- * @return method方法相关参数列表
- */
- public static List<Object[]> getMethodParams(String invokeTarget)
- {
- String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
- if (StringUtils.isEmpty(methodStr))
- {
- return null;
- }
- String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
- List<Object[]> classs = new LinkedList<>();
- for (int i = 0; i < methodParams.length; i++)
- {
- String str = StringUtils.trimToEmpty(methodParams[i]);
- // String字符串类型,以'或"开头
- if (StringUtils.startsWithAny(str, "'", "\""))
- {
- classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
- }
- // boolean布尔类型,等于true或者false
- else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
- {
- classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
- }
- // long长整形,以L结尾
- else if (StringUtils.endsWith(str, "L"))
- {
- classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
- }
- // double浮点类型,以D结尾
- else if (StringUtils.endsWith(str, "D"))
- {
- classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
- }
- // 其他类型归类为整形
- else
- {
- classs.add(new Object[] { Integer.valueOf(str), Integer.class });
- }
- }
- return classs;
- }
- /**
- * 获取参数类型
- *
- * @param methodParams 参数相关列表
- * @return 参数类型列表
- */
- public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
- {
- Class<?>[] classs = new Class<?>[methodParams.size()];
- int index = 0;
- for (Object[] os : methodParams)
- {
- classs[index] = (Class<?>) os[1];
- index++;
- }
- return classs;
- }
- /**
- * 获取参数值
- *
- * @param methodParams 参数相关列表
- * @return 参数值列表
- */
- public static Object[] getMethodParamsValue(List<Object[]> methodParams)
- {
- Object[] classs = new Object[methodParams.size()];
- int index = 0;
- for (Object[] os : methodParams)
- {
- classs[index] = (Object) os[0];
- index++;
- }
- return classs;
- }
- }
|