
org.dromara.hutool.cron.task.InvokeTask Maven / Gradle / Ivy
/*
* Copyright (c) 2023 looly([email protected])
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.cron.task;
import org.dromara.hutool.core.classloader.ClassLoaderUtil;
import org.dromara.hutool.core.exception.HutoolException;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.cron.CronException;
import java.lang.reflect.Method;
/**
* 反射执行任务
* 通过传入类名#方法名,通过反射执行相应的方法
* 如果是静态方法直接执行,如果是对象方法,需要类有默认的构造方法。
*
* @author Looly
*
*/
public class InvokeTask implements Task{
private final Object obj;
private final Method method;
/**
* 构造
* @param classNameWithMethodName 类名与方法名的字符串表示,方法名和类名使用#隔开或者.隔开
*/
public InvokeTask(final String classNameWithMethodName) {
int splitIndex = classNameWithMethodName.lastIndexOf('#');
if(splitIndex <= 0){
splitIndex = classNameWithMethodName.lastIndexOf('.');
}
if (splitIndex <= 0) {
throw new HutoolException("Invalid classNameWithMethodName [{}]!", classNameWithMethodName);
}
//类
final String className = classNameWithMethodName.substring(0, splitIndex);
if(StrUtil.isBlank(className)) {
throw new IllegalArgumentException("Class name is blank !");
}
final Class> clazz = ClassLoaderUtil.loadClass(className);
if(null == clazz) {
throw new IllegalArgumentException("Load class with name of [" + className + "] fail !");
}
this.obj = ConstructorUtil.newInstanceIfPossible(clazz);
//方法
final String methodName = classNameWithMethodName.substring(splitIndex + 1);
if(StrUtil.isBlank(methodName)) {
throw new IllegalArgumentException("Method name is blank !");
}
this.method = MethodUtil.getPublicMethod(clazz, false, methodName);
if(null == this.method) {
throw new IllegalArgumentException("No method with name of [" + methodName + "] !");
}
}
@Override
public void execute() {
try {
MethodUtil.invoke(this.obj, this.method);
} catch (final HutoolException e) {
throw new CronException(e.getCause());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy