在 Java 中使用 Groovy 主要有三种常用方法,每种方法适用于不同场景:
1. 使用 GroovyShell
(执行脚本片段)
适用场景:快速执行简单的 Groovy 脚本字符串或表达式。
特点:轻量级,适合动态计算或规则引擎。
java
复制
下载
import groovy.lang.Binding; import groovy.lang.GroovyShell; public class GroovyShellDemo { public static void main(String[] args) { // 1. 创建 Binding 传递变量 Binding binding = new Binding(); binding.setVariable("name", "Java"); // 2. 初始化 GroovyShell GroovyShell shell = new GroovyShell(binding); // 3. 执行 Groovy 脚本 Object result = shell.evaluate(""" "Hello from ${name}! " + (1 + 2) """); System.out.println(result); // 输出: Hello from Java! 3 } }
2. 使用 GroovyClassLoader
(动态加载类)
适用场景:动态编译并加载 Groovy 类,调用其方法(类似 Java 反射)。
特点:适合将 Groovy 作为插件或扩展逻辑。
java
复制
下载
import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; public class GroovyClassLoaderDemo { public static void main(String[] args) throws Exception { // 1. 创建 Groovy 类源码字符串 String script = """ class DynamicGroovy { String greet(String name) { "Hello, ${name}!" } } """; // 2. 使用 GroovyClassLoader 动态加载类 GroovyClassLoader loader = new GroovyClassLoader(); Class<?> groovyClass = loader.parseClass(script); // 3. 实例化并调用方法 GroovyObject groovyObject = (GroovyObject) groovyClass.getDeclaredConstructor().newInstance(); Object result = groovyObject.invokeMethod("greet", new Object[]{"Groovy"}); System.out.println(result); // 输出: Hello, Groovy! } }
3. 使用 JSR-223 ScriptEngine
(标准 API)
适用场景:需要兼容多种脚本语言(如 JavaScript、Python)的场景。
特点:跨语言标准,依赖 javax.script
包。
java
复制
下载
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class JSR223Demo { public static void main(String[] args) throws Exception { // 1. 获取 Groovy 脚本引擎 ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("groovy"); // 2. 向引擎传递变量 engine.put("x", 10); engine.put("y", 5); // 3. 执行脚本 Object result = engine.eval(""" z = x * y "Result: $z" """); System.out.println(result); // 输出: Result: 50 } }
依赖配置(Maven)
确保添加 Groovy 依赖(以最新版本为例):
xml
复制
下载
运行
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>3.0.20</version> <!-- 检查最新版本 --> </dependency> <!-- 若用 JSR-223,额外添加 --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-jsr223</artifactId> <version>3.0.20</version> </dependency>
方法对比
方法 | 优点 | 缺点 |
---|---|---|
GroovyShell | 简单直接,适合小脚本 | 不适合复杂类/方法调用 |
GroovyClassLoader | 可编译完整类,类似 Java 反射 | 需处理类加载和对象生命周期 |
JSR-223 ScriptEngine | 标准化,支持多语言 | 性能略低,依赖额外包 |
根据需求选择合适的方式,动态逻辑推荐 GroovyClassLoader
,简单计算用 GroovyShell
,多语言集成用 JSR-223。