【问题标题】:Can I add methods to a Groovy base Script dynamically, from Java?我可以从 Java 动态地将方法添加到 Groovy 基础脚本吗?
【发布时间】:2013-09-19 01:40:22
【问题描述】:

虽然这不是标准做法,但我很好奇是否可以将方法注入到 GroovyShell 编译上下文中。

这个想法是有类似的东西(在 Java 中):

GroovyShell shell = new GroovyShell();
Script script = shell.parse("test()");
script.run();

我想动态添加可调用的方法,test() 已在其中列出。

我已经尝试过处理 Script metaClass 的一些问题,但我看不到从 Java 中实际操作 metaClass 的方法。特别是,调用 script.getMetaClass().getMethods().add(...) 会引发 UnsupportedOperationException。

本质上,我想定义调用 Java 方法而不是基于 Groovy 的方法的 DSL 调用点。我愿意在 Groovy 中编写这部分(并且知道如何做到这一点),但我真的很好奇这是否是一种可行的替代方法,或者如果不是,那么陷阱是什么。

简而言之:如何动态定义GroovyShell 知道的方法?

【问题讨论】:

    标签: groovy dsl


    【解决方案1】:

    有两个非常简单的解决方案: a) 典型的“脚本”方法 b) 更时髦的方法

    a) 只是在您的脚本字符串前面加上一个定义您的方法的字符串。 b) 将引用放入绑定中,例如在“测试”的名称下。该引用的值是一个闭包对象或任何其他具有“call(args)”方法的对象。 当执行脚本时,Groovy 看到“test()”,它会首先尝试找到这样的方法,如果没有这样的方法,它会尝试将“test”解析为属性并在绑定中找到它。然后它将使用提供的参数(如果有)调用如此解析的引用(闭包)。

    还有更高级的选项,比如提供 CompilerConfiguration,这些都列在“Groovy in Action, 2nd edition”(无耻插件)的 DSL 章节中。

    【讨论】:

    • 您好,我也遇到了类似的问题。已在此处发布:stackoverflow.com/questions/27315115/groovy-dsl-with-java,但我仍在此处发布此评论,提出问题被卡住,希望您能提供一些帮助。我想在 DSL 中传递一个(Java)类名及其方法名。我想为该类创建一个实例,并从 Groovy 调用给定的方法。但是由于我将类作为“class xx.class-name”传递,因此无法创建其实例并执行所需的方法调用。你能在这里提供一些指导吗?谢谢。
    • 从 Java 中可以做到binding.setProperty("desiredMethodName", new MethodClosure(myObject, "myMethod"));。唯一的问题是不能覆盖现有方法。感谢您指出此选项。
    【解决方案2】:

    我没有运气使用 MethodClosure 搜索示例。这对我有用:

    Closure whoami = new Closure(this){
      @Override
      public Object call(Object... args) {
        //add custom logic here or read passed args
        return "javatar";
      }
    };
    Binding b = new Binding();
    b.setVariable("whoami", whoami);
    

    之后,我可以在我的 groovy 脚本中使用 whoami 作为方法

    whoami()
    

    如果是简单的方法,我更喜欢使用Dierk的选项A:

    只需在你的脚本字符串前面加上一个定义你的方法的字符串。

    但如果它很复杂,我会使用 Closure :D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      相关资源
      最近更新 更多