gpt4 book ai didi

java - Java 中不同类型的 Groovy 执行

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:33 25 4
gpt4 key购买 nike

我有 3 个关于在 Java 中使用 Groovy 的问题。它们都是相关的,所以我在这里只提出一个问题。

1)有:GroovyClassLoader、GroovyShell、GroovyScriptEngine。但是使用它们有什么区别呢?

例如这段代码:

static void runWithGroovyShell() throws Exception {
new GroovyShell().parse(new File("test.groovy")).invokeMethod("hello_world", null);
}

static void runWithGroovyClassLoader() throws Exception {
Class scriptClass = new GroovyClassLoader().parseClass(new File("test.groovy"));
Object scriptInstance = scriptClass.newInstance();
scriptClass.getDeclaredMethod("hello_world", new Class[]{}).invoke(scriptInstance, new Object[]{});
}

static void runWithGroovyScriptEngine() throws Exception {
Class scriptClass = new GroovyScriptEngine(".").loadScriptByName("test.groovy");
Object scriptInstance = scriptClass.newInstance();
scriptClass.getDeclaredMethod("hello_world", new Class[]{}).invoke(scriptInstance, new Object[]{});
}

2) 加载 groovy 脚本的最佳方法是什么,以便它以已编译 形式保留在内存中,然后我可以在需要时调用该脚本中的函数到。

3) 如何将我的 java 方法/类公开给 groovy 脚本,以便它可以在需要时调用它们?

最佳答案

方法 2 和 3 都返回解析后的 class。因此,一旦它们被解析并成功加载,您就可以使用 map 将它们保存在内存中。

Class scriptClass = new GroovyClassLoader().parseClass(new File("test.groovy"));
map.put("test.groovy",scriptClass);

更新:

GroovyObject链接到 groovy 对象文档。

也可以将对象直接转换为 GroovyObject 和其他 java 类是无法区分的。

Object aScript = clazz.newInstance();
MyInterface myObject = (MyInterface) aScript;
myObject.interfaceMethod();
//now here you can also cache the object if you want to

无法评论效率。但我想如果您将加载的类保存在内存中,那么一次解析不会造成太大伤害。

更新效率:您应该使用 GroovyScriptEngine,它在内部使用脚本缓存

这是链接:Groovy Script Engine

否则你总是可以自己使用一些性能基准测试它,你会得到粗略的想法。例如:在三个不同的循环中使用所有三种方法编译 groovy 脚本,看看哪个表现更好。尝试使用相同和不同的脚本,以查看缓存是否以某种方式启动。

更新参数传入和传出脚本 Binding class将帮助您将参数发送到脚本或从脚本发送。

Example Link

// setup binding
def binding = new Binding()
binding.a = 1
binding.setVariable('b', 2)
binding.c = 3
println binding.variables

// setup to capture standard out
def content = new StringWriter()
binding.out = new PrintWriter(content)

// evaluate the script
def ret = new GroovyShell(binding).evaluate('''
def c = 9
println 'a='+a
println 'b='+b
println 'c='+c
retVal = a+b+c
a=3
b=2
c=1
''')

// validate the values
assert binding.a == 3
assert binding.getVariable('b') == 2
assert binding.c == 3 // binding does NOT apply to def'd variable
assert binding.retVal == 12 // local def of c applied NOT the binding!

println 'retVal='+binding.retVal
println binding.variables
println content.toString()

关于java - Java 中不同类型的 Groovy 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com