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