gpt4 book ai didi

java - Groovy 在脚本基类中调用非预期的 "get(String)"方法

转载 作者:行者123 更新时间:2023-12-02 11:07:50 25 4
gpt4 key购买 nike

我有一个小程序,可以让用户执行任意 Groovy 代码。我使用一个基groovy.lang.Script类,它提供了许多方法,其中一个名为get。所有这些代码都是用 Java 编写的。

基类:

import groovy.lang.Script;
public class ScriptClass extends Script {

@Override
public Object run() {
return null;
}

//many other methods

public String get(String uri) {
System.out.println("get called with '" + uri + "'");
return uri;
}
}

上面的 get(String) 方法旨在作为 http(method=GET) 的别名。

Groovy shell 调用:

public static void main(String[] args) throws Exception {
CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
compilerConfiguration.setScriptBaseClass(ScriptClass.class.getName());

GroovyShell groovyShell = new GroovyShell(compilerConfiguration);

Map<String, Object> map = new HashMap<>();
map.put("no", "NO");

String template = "yes";
Script script = groovyShell.parse(template);
script.setBinding(new Binding(map));

Object res = script.run();
System.out.println(res);
}

输出:

get called with 'yes'
yes

当我更改输入代码时调用该方法:

String template = "no";

我找不到任何解释为什么调用此方法,也许我错过了一些文档段落。

问题:

  • 当脚本引用绑定(bind)中 undefined variable 时,为什么 Groovy 会调用 ScriptClass.get(String)
  • 如果此行为是标准/正确的,是否有办法防止将 undefined variable 的解析路由到 ScriptClass.get(String)

最佳答案

实际上你的 get 方法扰乱了 Groovy 的元编程能力。请参阅Groovy - difference between get and propertyMissing? 。引用: 当你重载 get 时,你就失去了 propertyMissing 功能。

在您的示例中,始终会评估模板。当模板为 no 时,脚本返回 NO,这是在绑定(bind)中定义的。当模板为 yes 时,将评估未绑定(bind)的变量 yes,未绑定(bind)的变量通常总是会导致调用 getpropertyMissing 但由于 get 在脚本中被覆盖而中断。

您必须在脚本中为 get 使用不同的方法名称。

关于java - Groovy 在脚本基类中调用非预期的 "get(String)"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50818762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com