首页 文章

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

提问于
浏览
1

解释

我正在开发一个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 回答

  • 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")调用变为可用 .

相关问题