文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在java中调用Groovy

2023-09-09 21:07

关注

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

Groovy 教程_w3cschoolGroovy语言:Groovy 教程_w3cschool

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

srpingboot中引入groovy

                    org.codehaus.groovy            groovy            2.4.5        

方式一:使用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_1public 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_2public 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);}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加载后的classClass 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.shelldef sayHello(String name) {println "Hello, " + name"GroovyShell_3_1中的sayHello()方法的返回值"} sayHello(name)

GroovyShell_3_2.groovy

package com.juxinli.groovy.shelldef 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);}}

来源地址:https://blog.csdn.net/S_L__/article/details/130107090

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯