前言
Groovy 是一种基于 JVM (Java虚拟机) 的敏捷开发语言,拥有与 Java 高度兼容性同时也提供了更灵活和简洁的语法。它既可以作为脚本语言使用,也可以编译成字节码。适合快速开发,支持领域特定语言(DSLs)和其他 Java 平台的语言无缝集成。
Java代码中使用Groovy
Groovy
语言是一种运行在java
虚拟机上的一种动态语言,它可以单独使用,也可以配合Java
语言一起使用,下面的部分,我们将用Java
项目结合Groovy
做一些学习和使用。
假设使用 Maven 管理依赖项,首先需在 pom.xml
文件中添加Groovy的依赖:
<dependencies>
<!-- 添加groovy的依赖 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.9</version>
</dependency>
</dependencies>
方式一:GroovyClassLoader动态加载Groovy Class文件
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import org.junit.jupiter.api.Test;
import java.lang.reflect.InvocationTargetException;
public class GroovyTest {
@Test
public void testGroovyClassLoader() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// java代码
String java = " " +
" public class Test { " +
" public int add(double a, double b) { " +
" double sum = a + b; " +
" System.out.println(\"Script sum=\" + sum); " +
" return sum.intValue(); " +
" } " +
" } ";
String groovy = " def call(int a,int b) { " +
" return a + b " +
"}";
GroovyClassLoader loader = new GroovyClassLoader();
Class javaScriptClass = loader.parseClass(java);
GroovyObject javaScriptInstance = (GroovyObject) javaScriptClass.getDeclaredConstructor().newInstance();
Object javaResult = javaScriptInstance.invokeMethod("add", new Object[]{1, 2});
System.out.println("Java result=" + javaResult);
Class groovyScriptClass = loader.parseClass(groovy);
GroovyObject groovyScriptInstance = (GroovyObject) groovyScriptClass.newInstance();
Object groovyResult = groovyScriptInstance.invokeMethod("call",new Object[] {1,2});
System.out.println("Groovy result=" + groovyResult);
}
}
效果:
方式二:GroovyShell执行Groovy脚本
mport groovy.lang.GroovyShell;
import org.junit.jupiter.api.Test;
public class GroovyTest {
@Test
public void testGroovyShell() {
String cmd="def sayHello() {\n" +
" println 'Hello Groovy'\n" +
"\n" +
" // 如果不写return, groovy方法的默认最后一行为 方法的返回值\n" +
" //return \"Hello Groovy\"\n" +
" \"Hello Groovy\"\n" +
"}\n" +
"\n" +
"sayHello()";
GroovyShell groovyShell = new GroovyShell();
Object evaluate = groovyShell.evaluate(cmd);
System.out.println("执行指令返回结果:"+evaluate);
}
}
效果:
方式三:GroovyScriptEngine脚本引擎加载Groovy脚本
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException;
import groovy.util.ScriptException;
import org.junit.jupiter.api.Test;
import java.io.IOException;
public class GroovyTest {
@Test
public void testGroovyScriptEngine() throws IOException, ScriptException, ResourceException {
// 这个路径应该指向脚本所在的目录
String directoryPath = "/Users/edy/Desktop/work/myself/code/demo/src/test/java/com/example/demo/";
// 创建 GroovyScriptEngine 实例传入的是目录路径
GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(directoryPath);
// 设置 Binding 变量
Binding binding = new Binding();
binding.setVariable("name", "王三");
binding.setVariable("age", 19);
// 运行脚本,传入的应该是具体脚本文件名称,假设脚本文件名为 "groovyScript.groovy"
Object result = groovyScriptEngine.run("groovyScript.groovy", binding);
System.out.println(result);
}
}
- groovyScript.groovy文件
def sayHello(name, age) {
printf("my name is %s,i am %s year old \n",name,age)
"Hello Groovy"
}
sayHello(name, age)
- 效果
- 注意: 使用GroovyScriptEngine加载脚本,指定的是文件夹,所以该文件夹下的所有脚本都可以执行