解释
我正在开发一个Java游戏,我在 Map 上有可编写脚本的对象(按钮,开关等) . 通过脚本表示我的意思是对象具有事件(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 回答
好吧,我找到了答案here . 我的test.script应该是这样的:
该脚本实际上成为一个类(即使它不包含类声明) . 我需要添加@Field注释,使其为声明的函数“全局” .
它还解决了EDIT2中提到的问题 . 该变量通过Java中的script.getProperty("someVariable")调用变为可用 .