通过反射从java执行编译的groovy脚本

通过反射从java执行编译的groovy脚本,java,groovy,reflection,Java,Groovy,Reflection,我有许多用GMaven编译的groovy脚本(位于src/main/groovy/somepackage),每个脚本都有run(String,String)函数,并且没有类: // script1.groovy def run(String name, String arg) { // body } // script2.groovy def run(String name, String arg) { // body } 我可以通过反射库找到它们并解析它们的类型: final S

我有许多用GMaven编译的groovy脚本(位于
src/main/groovy/somepackage
),每个脚本都有
run(String,String)
函数,并且没有类:

// script1.groovy
def run(String name, String arg) {
  // body
}


// script2.groovy
def run(String name, String arg) {
  // body
}
我可以通过反射库找到它们并解析它们的类型:

final Set<String> scripts = new Reflections(
  "somepackage",
   new SubTypesScanner(false)
).getAllTypes();
for (String script : scripts) {
  run(Class.forName(name));
}
final Set scripts=新的反射(
“somepackage”,
新的子扫描程序(错误)
).getAllTypes();
for(字符串脚本:脚本){
run(Class.forName(name));
}
然后我在执行方面遇到了一些问题:我无法创建scipt实例,因为它没有公共构造函数(只有一个带有
groovy.lang.Reference
参数的私有构造函数),并且在这种类型中找不到
run
方法


问题:如何使用反射正确地从Java执行已编译的groovy脚本(使用单个方法且不使用类)?

您可以使用以下命令从给定包加载已编译的groovy脚本:

Reflections.getSubTypesOf(groovy.lang.Script.class)
它返回一个
import groovy.lang.Script;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;

import java.util.Set;

public class LoadGroovyScriptExample {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        Set<Class<? extends Script>> scripts = new Reflections("somepackage", new SubTypesScanner(false))
                .getSubTypesOf(Script.class);

        for (Class<? extends Script> script : scripts) {
            script.newInstance().invokeMethod("run", new Object[] { "test", "123" });
        }
    }
}
package somepackage

def run(String name, String arg) {
    println "running script1.groovy: ${name}, ${arg}"
}
package somepackage

def run(String name, String arg) {
    println "running script2.groovy: ${name}, ${arg}"
}
[main] INFO org.reflections.Reflections - Reflections took 93 ms to scan 1 urls, producing 1 keys and 2 values 
running script2.groovy: test, 123
running script1.groovy: test, 123