繁体   English   中英

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

[英]How to run correctly a custom Groovy script in an application?

说明

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

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

问题

但是我的groovy脚本文件有问题。 这是文件:

test.groovy

def someVariable = 'test';

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

这是创建脚本对象的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);
}

但是我的常规脚本失败,并显示以下消息:

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

好吧,我在这里找到了答案。 我的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”)调用变为可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM