如何在应用程序中正确运行自定义Groovy脚本?

时间:2014-08-12 18:47:13

标签: java groovy groovyshell

解释

我正在使用Java进行游戏,我在地图上有可编写脚本的对象(按钮,开关等)。通过脚本表示我的意思是对象具有事件(onActivation,onPress等等),并且需要将脚本文件附加到对象以便在激活或按下时执行某些操作。

因此事件处理是通过脚本完成的。我的想法是通过GroovyScriptEngine.createScript方法在Java中创建一个Groovy Script对象。然后我在java中调用Script.invokeMethod(" onActivation",null)以在onActivation发生时运行脚本。这似乎有效。

问题

但是我的groovy脚本文件中存在问题。这是文件:

test.groovy

def someVariable = 'test';

def onActivation() {
    println testMessage;   // comes from bindings
    println someVariable;
}

这是我创建Script对象的java代码:

GroovyScriptEngine engine = new GroovyScriptEngine("assets/Scripts/");
Binding bindings = new Binding();
bindings.setProperty("testMessage", "Hello Script World!");
Script script = engine.createScript("test.groovy", bindings);

稍后在java代码中,当处理onActivation事件时,我从脚本中调用onActivation函数:

public void onActivationHandler() {
    script.invokeMethod("onActivation", null);
}

但我的groovy脚本失败了这条消息:

Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
groovy.lang.MissingPropertyException: No such property: someVariable for class: test

如果我删除someVariable声明和我打印它的行,我的脚本工作并打印以下消息: Hello Script World!

TL; DR

为什么我的脚本会失败?为什么我的函数没有看到名为 someVariable 的变量?

修改

当我尝试使用GroovyShell而不是GroovyScriptEngine时,会发生同样的事情。

EDIT2

如果我通过调用 script.getProperty(" someVariable")尝试在Java代码中获取 someVariable 的值,则会抛出异常我认为变量不存在。

org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: someVariable for class: proof

1 个答案:

答案 0 :(得分:1)

好的,我找到了答案here。我的test.script应该是这样的:

import groovy.transform.Field

@Field String someVariable = 'test';

def onActivation() {
    println testMessage;   // comes from bindings
    println someVariable;
}

该脚本实际上变成了一个类(即使它不包含类声明)。我需要添加@Field注释,使其对于声明的函数“全局”。

它还解决了EDIT2中提到的问题。该变量通过Java中的 script.getProperty(“someVariable”)调用可用。