在java中调用Groovy

这篇具有很好参考价值的文章主要介绍了在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文章来源地址https://www.toymoban.com/news/detail-477606.html

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);
	}
}

到了这里,关于在java中调用Groovy的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Groovy系列三 Java SpringBoot 整合 Groovy

      目录 一、概述 一、在Java中使用Groovy: 二、在Groovy中使用Java: 三、几种范式的不同、优缺点 Java调用Groovy的类和方法: Groovy调用Java的类和方法:  使用GroovyShell执行Groovy脚本: 使用GroovyClassLoader加载和执行Groovy脚本: 二、实战 第一步、与SpringBoot集成,引入依赖 第二步、

    2024年02月08日
    浏览(39)
  • Groovy食谱: 第4章 Java和Groovy集成

    Groovy最大的卖点之一是它与Java的无缝集成。在本章中,我们将以各种方式探讨这种集成。我们将使用普通的旧Groovy对象(POGOs)作为普通旧Java对象(pojo)的完全替代。我们将从Java调用Groovy代码,从Groovy调用Java代码。最后,我们将探索如何使用Ant来编译整个项目,包括Groovy和Java类

    2024年02月07日
    浏览(35)
  • CutLER:一种用于无监督目标检测和实例分割的方法

    本文分享自华为云社区《CutLER:一种用于无监督目标检测和实例分割的方法》,作者:Hint。 目标检测是计算机视觉中的一种重要任务,使AI系统感知、推理、理解目标。训练定位模型需要特别的标注,比如目标的框、掩膜、定位点等。本文的工作研究了无监督的目标检测和实

    2024年02月12日
    浏览(40)
  • 什么是T-SQL编程?T-SQL是Transact-SQL的缩写,是一种扩展了SQL(结构化查询语言)的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-

    什么是T-SQL编程? T-SQL是Transact-SQL的缩写,是一种 扩展了SQL(结构化查询语言) 的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-SQL支持创建 存储过程、触发器、函数 等高级特性,能够更加灵活地进行数据操作和处理。基本的T-SQL语法与标准SQL很相

    2024年01月21日
    浏览(91)
  • 论文阅读-AFLNET:一种用于网络协议的灰盒模糊器

    现有服务器模糊测试的困难性: 服务器具有庞大的状态空间 服务器的响应依赖于当前消息和内部服务器状态 现有模糊测试方法在处理服务器模糊测试时的局限性 协议规范和实际协议实现之间的不匹配 AFLNet的创新(解决问题): 变异方法:AFLNet采用了变异方法,通过对初始

    2024年02月07日
    浏览(46)
  • NodeFormer:一种用于节点分类的可扩展图结构学习Transformer

    图神经网络已经被广泛研究用于利用互连数据进行学习。尽管如此,最近的证据表明,GNN的缺陷与过度挤压、异质性、处理长程依赖性、边缘不完全性有关,尤其是完全没有图。虽然一个合理的解决方案是学习用于消息传递的新的自适应拓扑,但有关二次复杂性的问题阻碍了

    2024年02月11日
    浏览(58)
  • Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言

    作者:Seth Payne 特别声明 :截止撰写该博文,在目前的公开发行版中,该功能还不能公开测试。这个功能将在未来的发行版中发布。 长期以来,Elastic Platform 一直被视为搜索用例和机器生成数据的分析系统。 分析专注于处理摄入的数据,其中重要的思想是如何在 Elasticsearch

    2023年04月23日
    浏览(33)
  • java脚本引擎Groovy实战

    目录 一、场景描述 二、javascript语法引擎 JavaScriptEngine getEngineByName eval NashornScriptEngine 三、Groovy语法引擎 一.使用GroovyClassLoader 二、原理  三、调用groovy脚本实现方式 1.使用GroovyClassLoader 2.使用ScriptEngine 3.使用GroovyShell 四、性能优化  五、解决方案 四、项目实战  一、概述 二

    2024年02月07日
    浏览(35)
  • iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像

    试剂 | 基础知识概述(部分): 中文名称:Alexa Fluor 594酪Styramide 分子量:1341.71 胺的优异替代品 100 Slides 英文名称:iFluor 594 Ex (nm):588 Em (nm):604 规格标准:1g,5g,10g,可提供mg级以及kg级的产品开发服务 试剂 |  包装:   试剂 | 反应机理(部分): iFluor 594 Styramide是一种荧光

    2024年02月11日
    浏览(44)
  • 文献学习-14-一种用于高精度微创手术的纤维机器人

    Authors: Mohamed E. M. K. Abdelaziz1,2 †, Jinshi Zhao1,3 †, Bruno Gil Rosa1,2 , Hyun-Taek Lee4 , Daniel Simon3,5 , Khushi Vyas1,2 , Bing Li6,7 , Hanifa Koguna3 , Yue Li1 , Ali Anil Demircali3 , Huseyin Uvet8 , Gulsum Gencoglan9,10, Arzu Akcay11,12, Mohamed Elriedy13, James Kinross14, Ranan Dasgupta15, Zoltan Takats3,5 , Eric Yeatman2 , Guang-Zhong Yang16

    2024年03月10日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包