JobInvokeUtil.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.ruoyi.quartz.util;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import com.ruoyi.common.utils.StringUtils;
  7. import com.ruoyi.common.utils.spring.SpringUtils;
  8. import com.ruoyi.quartz.domain.SysJob;
  9. /**
  10. * 任务执行工具
  11. *
  12. * @author ruoyi
  13. */
  14. public class JobInvokeUtil
  15. {
  16. /**
  17. * 执行方法
  18. *
  19. * @param sysJob 系统任务
  20. */
  21. public static void invokeMethod(SysJob sysJob) throws Exception
  22. {
  23. String invokeTarget = sysJob.getInvokeTarget();
  24. String beanName = getBeanName(invokeTarget);
  25. String methodName = getMethodName(invokeTarget);
  26. List<Object[]> methodParams = getMethodParams(invokeTarget);
  27. if (!isValidClassName(beanName))
  28. {
  29. Object bean = SpringUtils.getBean(beanName);
  30. invokeMethod(bean, methodName, methodParams);
  31. }
  32. else
  33. {
  34. Object bean = Class.forName(beanName).newInstance();
  35. invokeMethod(bean, methodName, methodParams);
  36. }
  37. }
  38. /**
  39. * 调用任务方法
  40. *
  41. * @param bean 目标对象
  42. * @param methodName 方法名称
  43. * @param methodParams 方法参数
  44. */
  45. private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
  46. throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
  47. InvocationTargetException
  48. {
  49. if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
  50. {
  51. Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
  52. method.invoke(bean, getMethodParamsValue(methodParams));
  53. }
  54. else
  55. {
  56. Method method = bean.getClass().getDeclaredMethod(methodName);
  57. method.invoke(bean);
  58. }
  59. }
  60. /**
  61. * 校验是否为为class包名
  62. *
  63. * @param invokeTarget 名称
  64. * @return true是 false否
  65. */
  66. public static boolean isValidClassName(String invokeTarget)
  67. {
  68. return StringUtils.countMatches(invokeTarget, ".") > 1;
  69. }
  70. /**
  71. * 获取bean名称
  72. *
  73. * @param invokeTarget 目标字符串
  74. * @return bean名称
  75. */
  76. public static String getBeanName(String invokeTarget)
  77. {
  78. String beanName = StringUtils.substringBefore(invokeTarget, "(");
  79. return StringUtils.substringBeforeLast(beanName, ".");
  80. }
  81. /**
  82. * 获取bean方法
  83. *
  84. * @param invokeTarget 目标字符串
  85. * @return method方法
  86. */
  87. public static String getMethodName(String invokeTarget)
  88. {
  89. String methodName = StringUtils.substringBefore(invokeTarget, "(");
  90. return StringUtils.substringAfterLast(methodName, ".");
  91. }
  92. /**
  93. * 获取method方法参数相关列表
  94. *
  95. * @param invokeTarget 目标字符串
  96. * @return method方法相关参数列表
  97. */
  98. public static List<Object[]> getMethodParams(String invokeTarget)
  99. {
  100. String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
  101. if (StringUtils.isEmpty(methodStr))
  102. {
  103. return null;
  104. }
  105. String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
  106. List<Object[]> classs = new LinkedList<>();
  107. for (int i = 0; i < methodParams.length; i++)
  108. {
  109. String str = StringUtils.trimToEmpty(methodParams[i]);
  110. // String字符串类型,以'或"开头
  111. if (StringUtils.startsWithAny(str, "'", "\""))
  112. {
  113. classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
  114. }
  115. // boolean布尔类型,等于true或者false
  116. else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
  117. {
  118. classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
  119. }
  120. // long长整形,以L结尾
  121. else if (StringUtils.endsWith(str, "L"))
  122. {
  123. classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
  124. }
  125. // double浮点类型,以D结尾
  126. else if (StringUtils.endsWith(str, "D"))
  127. {
  128. classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
  129. }
  130. // 其他类型归类为整形
  131. else
  132. {
  133. classs.add(new Object[] { Integer.valueOf(str), Integer.class });
  134. }
  135. }
  136. return classs;
  137. }
  138. /**
  139. * 获取参数类型
  140. *
  141. * @param methodParams 参数相关列表
  142. * @return 参数类型列表
  143. */
  144. public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
  145. {
  146. Class<?>[] classs = new Class<?>[methodParams.size()];
  147. int index = 0;
  148. for (Object[] os : methodParams)
  149. {
  150. classs[index] = (Class<?>) os[1];
  151. index++;
  152. }
  153. return classs;
  154. }
  155. /**
  156. * 获取参数值
  157. *
  158. * @param methodParams 参数相关列表
  159. * @return 参数值列表
  160. */
  161. public static Object[] getMethodParamsValue(List<Object[]> methodParams)
  162. {
  163. Object[] classs = new Object[methodParams.size()];
  164. int index = 0;
  165. for (Object[] os : methodParams)
  166. {
  167. classs[index] = (Object) os[0];
  168. index++;
  169. }
  170. return classs;
  171. }
  172. }