在java中调用Groovy

  • Groovy是什么?

Groovy 是 用于Java虚拟机的一种敏捷的动态语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使Groovy 与 Java 代码的互操作很容易。

Groovy 教程_w3cschoolGroovy语言:Groovy 教程_w3cschool

groovy与java中结合使用,场景举例:在数据库中存储groovy语句,在java代码中拿出来执行。通过这个可以设计一个公共的工具。

srpingboot中引入groovy

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.4.5</version>
        </dependency>

  • 在java中调用groovy的方式

方式一:使用GroovyShell执行groovy脚本

1.1使用 GroovyShell 执行groovy字符串

    public static void main(String[] args) {
        String ss = "def x = 5;\n" +
                "println('Hello World' + x);";
        GroovyShell shell = new GroovyShell();
        shell.evaluate(ss);
    }

1.2:通过evaluate方法调用groovy脚本文件

首先新建一个Groovy文件:GroovyShell_1_1.groovy,里面有一个无参的方法sayHello,并在最后调用该方法。

// 不带参数的groovy方法
def sayHello() {
	println 'Hello World.'
	
	// 如果不写return, groovy方法的默认最后一行为 方法的返回值
	//return "GroovyShell_1中的sayHello()方法的返回值"
	"GroovyShell_1中的sayHello()方法的返回值"
}
 
// 运行groovy方法
sayHello()

在Java中就可以直接调用这个groovy文件执行了,方法如下:

// 调用GroovyShell_1_1
public static void testGroovy2() throws CompilationFailedException, IOException {
	GroovyShell groovyShell = new GroovyShell();
	Object result = groovyShell.evaluate(new File("src/main/java/com/juxinli/groovy/GroovyShell_1_1.groovy"));
	logger.info(result.toString());
}

这种方式也可以传参

// 带参数的groovy方法
def sayHello(name) {
	println "Hello " + name + "."
	
	// 如果不写return, groovy方法的默认最后一行为 方法的返回值
	//return "GroovyShell_1中的sayHello()方法的返回值"
	"GroovyShell_1中的sayHello(name)方法的返回值"
}
 
// 运行groovy方法
sayHello(name)
// 调用GroovyShell_1_2
public static void testGroovy3() throws CompilationFailedException, IOException {
	// 调用带参数的groovy shell时,使用bind绑定数据
	Binding binding = new Binding();
	binding.setProperty("name", "Juxinli");
		
	GroovyShell groovyShell = new GroovyShell(binding);
	Object result = groovyShell.evaluate(new File("src/main/java/com/juxinli/groovy/GroovyShell_1_2.groovy"));
	logger.info(result.toString());
}

方式二:通过GroovyClassLoader动态加载Groovy Class

GroovyClassLoader,用来加载Groovy类的加载器

首先新建了Groovy Class

package com.juxinli.groovy
 
class GroovyShell_2 {
	public String sayHello(String name, String sex, int age) {
		println 'GroovyShell_2 的sayHello(String name, String sex, int age)方法';
		return "name: " + name + ", sex: " + sex + ", age: " + age;
	}
}

在Tool_GroovyShell_2中就可以加载该Groovy Class了.。该方式和java的反射相似。

public class Tool_GroovyShell_2 {
	
	private static Logger logger = Logger.getLogger(Tool_GroovyShell_2.class);
	private static GroovyClassLoader groovyClassLoader = null;
 
	public static void initGroovyClassLoader() {
		CompilerConfiguration config = new CompilerConfiguration();
		config.setSourceEncoding("UTF-8");
		// 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认)
		groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
	}
	
	/**
	 * 通过GroovyClassLoader加载GroovyShell_2,并反射调用其sayHello(String name, String sex, int age)方法
	 * 
	 */
	public static String invokeSayHello(String name, String sex, int age) {
		String result = "";
		
		File groovyFile = new File("src/main/java/com/juxinli/groovy/GroovyShell_2.groovy");
		if (!groovyFile.exists()) {
			return result;
		}
		
		try {
			// 获得GroovyShell_2加载后的class
			Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
			// 获得GroovyShell_2的实例
			GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
			// 反射调用sayHello方法得到返回值
			Object methodResult = groovyObject.invokeMethod("sayHello", new Object[] {name, sex, age});
			if (methodResult != null) {
				result = methodResult.toString();
			}
		} catch (Exception e) {
			logger.warn("加载groovy类失败", e);
		}
		
		return result;
	}
	
	public static void main(String[] args) throws Exception {
		
		initGroovyClassLoader();
		System.out.println(invokeSayHello("张三", "男", 25));
	}
	
}

方式三:使用GroovyScriptEngine脚本引擎加载Groovy脚本

GroovyScriptEngine从指定的位置(文件系统,URL,数据库等等)加载Groovy脚本,并且随着脚本变化可重新加载它们。

首先在com.juxinli.groovy.shell包中新建2个groovy script

GroovyShell_3_1.groovy

package com.juxinli.groovy.shell
def sayHello(String name) {
	println "Hello, " + name
	
	"GroovyShell_3_1中的sayHello()方法的返回值"
}
 
sayHello(name)

GroovyShell_3_2.groovy

package com.juxinli.groovy.shell
def sayHello(String name) {
	println "你好, " + name
	
	"GroovyShell_3_2中的sayHello()方法的返回值"
}
 
sayHello(name)

使用GroovyScriptEngine从com.juxinli.groovy.shell包中加载、运行这些script

public class Tool_GroovyShell_3 {
	
	public static void main(String[] args) throws Exception {
		// GroovyScriptEngine的根路径,如果参数是字符串数组,说明有多个根路径
		GroovyScriptEngine engine = new GroovyScriptEngine("src/main/java/com/juxinli/groovy/shell/");
		//GroovyScriptEngine engine = new GroovyScriptEngine(new String[] {"src/main/java/com/juxinli/groovy/shell/"});
		
		Binding binding = new Binding();
		binding.setVariable("name", "juxinli");
		
		Object result1 = engine.run("GroovyShell_3_1.groovy", binding);
		System.out.println(result1);
		Object result2 = engine.run("GroovyShell_3_2.groovy", binding);
		System.out.println(result2);
	}
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java调用Groovy包,需要使用Groovy的编译器API。下面是调用Groovy包的步骤: 1. 在Java项目添加对Groovy库的依赖。 2. 编写Groovy代码,并将其保存为Groovy脚本或类。 3. 在Java创建GroovyShell对象,将Groovy脚本或类加载到该对象。 4. 使用GroovyShell对象执行Groovy脚本或类的方法。 下面是一个简单的示例: 首先,添加对Groovy库的依赖,例如使用Maven添加以下依赖: ``` <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.5.6</version> </dependency> ``` 然后,编写一个Groovy类,例如: ``` package com.example.groovy class Greeter { String greeting(String name) { return "Hello, $name!" } } ``` 将Groovy类保存在`src/main/resources/com/example/groovy/Greeter.groovy`。 接下来,在Java加载Groovy类并执行的方法,例如: ``` import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; public class Main { public static void main(String[] args) throws Exception { GroovyClassLoader loader = new GroovyClassLoader(); Class groovyClass = loader.parseClass(Main.class.getResource("com/example/groovy/Greeter.groovy")); GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); String result = (String) groovyObject.invokeMethod("greeting", "World"); System.out.println(result); } } ``` 在上面的示例,首先创建了一个GroovyClassLoader对象,并使用它加载了Groovy类。然后创建了一个GroovyObject对象,并使用它调用Groovy的`greeting`方法。最后,输出了方法的返回值。 希望这个例子可以帮助你理解如何在Java调用Groovy包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值