Java使用Groovy的方式

前言

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加载脚本,指定的是文件夹,所以该文件夹下的所有脚本都可以执行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值