【问题标题】:How to run correctly a custom Groovy script in an application?如何在应用程序中正确运行自定义 Groovy 脚本?
【发布时间】: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


    【解决方案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") 调用变得可用。

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 2013-12-17
      • 2012-01-01
      • 2011-03-21
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多