【发布时间】:2014-10-05 23:14:13
【问题描述】:
说明
我正在使用 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 声明和我打印它的行,我的脚本会工作并打印以下消息: 你好脚本世界!
TL;DR
为什么我的脚本失败了?为什么我的函数看不到名为 someVariable 的变量?
编辑
当我尝试使用 GroovyShell 而不是 GroovyScriptEngine 时,也会发生同样的事情。
编辑2
如果我尝试通过调用 script.getProperty("someVariable") 在 Java 代码中获取 someVariable 的值,它会抛出一个异常,告诉我该变量确实存在不存在。
org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: someVariable for class: proof
【问题讨论】:
标签: java groovy groovyshell