前言
GroovyClassLoader 也是 Java 的一个类加载器实现,它可以将一段源码解析为 Class。xxl-job 中的 GlueFactory 就使用了此类加载器来支持 GLUE 运行模式(任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler)。
使用
添加maven依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.10</version>
</dependency>
要执行的源码 resources/User.txt
public class User {
public void hi() {
System.out.println("Hello User.hi");
}
}
测试代码
import groovy.lang.GroovyClassLoader;
import org.apache.commons.io.IOUtils;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class TestGroovy {
public static void main(String[] args) throws Exception {
InputStream inputStream = TestGroovy.class.getClassLoader().getResourceAsStream("User.txt");
if (Objects.nonNull(inputStream)) {
String codeScoure = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
Class aClass = groovyClassLoader.parseClass(codeScoure);
System.out.println(aClass.getClassLoader());
Object instance = aClass.getConstructor().newInstance();
System.out.println(instance);
aClass.getMethod("hi").invoke(instance);
}else {
System.out.println("parse error");
}
}
}
可以正常执行 User 类的 hi 方法。