[英]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.