前言

Groovy 是一种基于 JVM 的动态语言,与 Java 语言严密集成,能够很方便地在 Java 项目中运用。Groovy 有着简洁的语法、灵活的类型体系、强大的元编程才能,适合编写各种类型的脚本和应用程序。运用groovy也能够完成java程序的动态扩展,和用于插件化的开发,增强体系的可扩展性。

运用办法

GroovyShell

GroovyShell 是 Groovy 的一个核心类,它能够在 Java 中履行 Groovy 代码。

咱们先写一个简略的groovy测验脚本,输出 “hello world”。

package com.arm.groovy
println("GroovyShell test : hello world");

那么在java中怎么调用呢?其实只需求3行代码就能够了:

GroovyShell shell = new GroovyShell();
Script script = shell.parse(new FileReader("test.groovy"));
script.run();
  • 其履行进程是:首要实例化一个GroovyShell的目标,然后经过GroovyShell解析groovy脚本文件的内容并回来Script目标,最终履行run()办法,履行脚本内容。
  • 这种办法支撑支撑 REPL(Read-Eval-Print Loop)形式,能够在命令行中逐行输入和履行 Groovy 代码。适用于快速测验和调试 Groovy 代码,或者是项目中有独立的可履行的groovy脚本文件。

REPL(Read-Eval-Print Loop)是一种交互式编程环境,它允许用户逐行输入代码,然后当即履行,并输出成果。REPL 环境通常用于快速测验和调试代码,因为它能够实时地展示代码履行的成果,帮助用户快速找到过错和调试代码。

在 Groovy 中,Groovy Shell 便是一种基于 REPL 的交互式编程环境。用户能够在 Groovy Shell 中逐行输入 Groovy 代码,并当即履行。当用户输入一行代码后,Groovy Shell 会当即对该代码进行解析、编译和履行,并输出履行成果,然后等候用户输入下一行代码。因为 Groovy Shell 的实时履行特性,它也常被用于探索性编程和演示代码。

除了 Groovy Shell,其他语言和渠道也有相似的 REPL 工具,如 Python 的交互式环境(Python REPL)、Node.js 的命令行工具(Node.js REPL)等。这些工具都是一种交互式编程环境,能够帮助用户快速测验和调试代码。

GroovyClassLoader

咱们先写一个简略的groovy测验脚本,输出 “hello world”。

package com.arm.groovy
def test() {
    println("GroovyClassLoader test : hello world");
}

那么在java中怎么调用呢?

try (GroovyClassLoader classLoader = new GroovyClassLoader()) {
    Class<?> groovyClass = classLoader.parseClass(new File("test.groovy"));
    GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
    groovyObject.invokeMethod("test", null);
}

其履行进程是:首要实例化一个GroovyClassLoader的目标,然后经过GroovyClassLoader 解析groovy脚本并生成一个Class文件,在然后实例化一个GroovyObject,经过GroovyObject履行脚本中的办法。

能够看到这种办法比较强大的,其经过类加载的办法进行脚本的加载和解析,使其在java中能够像调用java类的办法一样调用groovy脚本中的办法。因而GroovyClassLoader 适用于需求动态加载和履行 Groovy 脚本的场景,如插件化体系、动态扩展;也适用于一些需求在运行时动态生成和编译代码的场景。

比如咱们能够界说个groovy类,其完成一个java接口,在java运行时咱们能够将这个groovy加载到spring容器中,经过bean的办法运用groovy脚本。

在 Groovy 中,一切的 Groovy 类都是 Java 类的子类,包括经过 Groovy 脚本动态生成的类。因而,当运用 GroovyClassLoader 加载 Groovy 脚本并编译生成 Groovy 类后,得到的 Class 目标实际上也是 Groovy 类型的 Class 目标,能够被强制转换为 GroovyObject 类型。

GroovyObject 接口是一切 Groovy 类的基类,它界说了 Groovy 类的根本行为和属性。因而,只需一个类完成了 GroovyObject 接口,它就能够被认为是一个 Groovy 类。在 Groovy 中,一切的 Groovy 类都默认完成了 GroovyObject 接口,因而,当咱们从 GroovyClassLoader 加载 Groovy 类后,能够直接将其强制转换为 GroovyObject 类型。

当然这种办法咱们也能够直接写脚本代码,而无需求脚本文件:

Binding binding = new Binding();
binding.setVariable("name", "Groovy");
GroovyShell shell = new GroovyShell(binding);
Object result = shell.evaluate("println 'Hello, ' + name");

上述示例直接用 shell.evaluate() 的办法直接履行脚本句子。

ScriptEngineManager

首要咱们仍是预备一个脚本文件:

package com.arm.groovy
println("ScriptEngineManager test : hello world");

java调用:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
engine.eval(new FileReader("test.groovy"));

其实这种办法和第一种办法迥然不同,二选其一就能够了。