我想例化一个普通的班级,我有些担心
我的首选是使用GroovyShell:
groovy脚本:
class Foo {
public String doStuff(String stuff) {
return stuff + "_utils";
}
}
new Foo(); // ??
主脚本:
GroovyShell shell = new GroovyShell();
Script script = shell.parse(new File(path));
def clazz = script.run();
String result = clazz.doStuff("test");
print(result); // test_utils;
第二个选项是使用GroovyClassLoader:
groovy脚本
class Foo {
public String doStuff(String stuff) {
return stuff + "_utils";
}
}
主脚本
GroovyClassLoader loader = new GroovyClassLoader();
Script script = loader.parseClass(new File(path))
Object clazz = script.newInstance();
Object[] args = new Object[1];
args[0] = "test";
String result = clazz.invokeMethod("doStuff", args);
print(result) // test_utils
两者都可以正常运行,我更喜欢使用GroovyShell,因为我在当前代码的任何地方都使用了GroovyShell,但是我不知道脚本中的new Foo()
是否会导致任何内存泄漏。有可能吗?
答案 0 :(得分:1)
GroovyShell使用默认的GroovyClassLoader。因此,如果您不需要GroovyClassLoader提供的任何其他特定功能,则应坚持使用GroovyShell使其保持简单。 GroovyShell和GroovyClassLoader是收集的垃圾的实例,我不认为这两个实例都不存在内存泄漏。
答案 1 :(得分:0)
在@ daggett's的帮助下,我设法找到了适合我需要的解决方案。
我完全不会使用groovy类。
一个简单的例子
实用程序脚本:
Cannot query field "category" on type "Query".
从常规groovy脚本中调用实用程序方法
String doStuff() {
return "doStuff";
}
String doStuff2(){
return "doStuff2";
}
这不是原始问题的答案,但是因为它符合我的需求,所以很好。