繁体   English   中英

实例化groovy类的正确方法

[英]Correct way to instantiate a groovy class

我想低调讲课,我有些担心

我的首选是使用GroovyShell

常规脚本:

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

常规脚本

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,因为我在当前代码中到处都使用它,但是我不知道脚本中的new Foo()是否会导致内存泄漏。 可能吗?

GroovyShell使用默认的GroovyClassLoader。 因此,如果您不需要GroovyClassLoader提供的任何其他特定功能,则应坚持使用GroovyShell使其保持简单。 GroovyShell和GroovyClassLoader是收集的垃圾的实例,我不认为这两个实例都存在内存泄漏。

在@ daggett的帮助下,我设法找到了适合我需要的解决方案。

我根本不会使用groovy类。

一个简单的例子

实用groovy脚本:

String doStuff() {
    return "doStuff";
}

String doStuff2(){
    return "doStuff2";
}

从主要的Groovy脚本调用实用程序方法

GroovyShell shell = new GroovyShell();
Script utilsScript = shell.parse(new File(PATH_TO_UTIL_SCRIPT));
String result = utilsScript.doStuff();
println(result); // doStuff;
String result2 = utilsScript.doStuff2();
println(result2); // doStuff2;

这不是原始问题的答案,但是由于它适合我的需求,所以我很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM