实例化groovy类的正确方法

时间:2019-06-05 11:06:12

标签: java groovy

我想例化一个普通的班级,我有些担心

我的首选是使用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()是否会导致任何内存泄漏。有可能吗?

2 个答案:

答案 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";
}

这不是原始问题的答案,但是因为它符合我的需求,所以很好。