首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式Groovy:如何使用外部变量的静态类型检查?

嵌入式Groovy:如何使用外部变量的静态类型检查?
EN

Stack Overflow用户
提问于 2017-08-09 15:19:22
回答 1查看 801关注 0票数 4

我想嵌入Groovy,以便在我的Java应用程序中启用脚本功能。我想使用静态类型检查,此外,我还想向脚本传递一些额外的(全局)变量。这是我的配置:

代码语言:javascript
复制
    String script = "println(name)";  // this script was entered by the user

    // compiler configuration for static type checking
    CompilerConfiguration config = new CompilerConfiguration();
    config.addCompilationCustomizers(new ASTTransformationCustomizer(CompileStatic.class));

    // compile the script
    GroovyShell shell = new GroovyShell(config);
    Script script = shell.parse(script);

    // later, when we actually need to execute it...
    Binding binding = new Binding();
    binding.setVariable("name", "John");
    script.setBinding(binding);
    script.run();

如您所见,用户提供的脚本使用全局变量name,它是通过script.setBinding(...)注入的。现在有一个问题:

  • 如果我在用户脚本中声明变量name (例如String name;),那么绑定没有效果,因为该变量已经存在于脚本中。
  • 如果我没有在脚本中声明变量,静态类型检查器就会(正确地)抱怨没有声明name

问题是:如何解决这个问题?如何告诉类型检查器,当调用脚本时,脚本将接收特定类型的全局变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-09 15:58:30

文档中,可以使用extensions参数,

代码语言:javascript
复制
config.addCompilationCustomizers(
    new ASTTransformationCustomizer(
        TypeChecked,
        extensions:['robotextension.groovy'])
)

然后将robotextension.groovy添加到类路径中:

代码语言:javascript
复制
unresolvedVariable { var ->
    if ('name'==var.name) {
        storeType(var, classNodeFor(String))
        handled = true
    }
}

这里,我们告诉编译器,如果找到了一个未解决的变量,并且变量的名称是name,那么我们可以确保这个变量的类型是String

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45594683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档