加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

嵌入Groovy

发布时间:2020-12-14 16:48:21 所属栏目:大数据 来源:网络整理
导读:Groovy就其本身而言,在不同的场景下都算是一门非常不错的编程语言,特别是在与Java混用的环境下,Groovy显得更加强大。出于这种考虑,Groovy被设计成非常轻量级,并且易于嵌入到任何Java应用系统中。 目前主要有3种方法将Groovy与Java集成起来,细节会在下

Groovy就其本身而言,在不同的场景下都算是一门非常不错的编程语言,特别是在与Java混用的环境下,Groovy显得更加强大。出于这种考虑,Groovy被设计成非常轻量级,并且易于嵌入到任何Java应用系统中。

目前主要有3种方法将Groovy与Java集成起来,细节会在下文中讨论。

还有一种可选方案是,如果你确实需要使用其他脚本语言,可以利用Bean Scripting Framework将任何脚本语言集成到你的Java代码中(虽然我们难以想象这么做的原因)。

利用shell执行脚本或者表达式

你可以使用GroovyShell执行Groovy中的任何表达式或者脚本。

GroovyShell允许你通过Binding对象传进和传出变量。

// call groovy expressions from Java code
Binding binding = new Binding();

binding.setVariable("foo",new Integer(2));

GroovyShell shell = new GroovyShell(binding);

Object value = shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");

assert value.equals(new Integer(20));

assert binding.getVariable("x").equals(new Integer(123));

利用一个常用基类执行脚本

将Groovy脚本继承自一个你选择的基类,之后便可以访问脚本的常规方法,这种做法往往非常有用。可以通过在编译配置中设置脚本基类属性,并将新的编译配置传递给shell完成这一操作。

class ScriptBaseTest {

    @Test void extend_groovy_script() {

        def configuration = new CompilerConfiguration()

        configuration.setScriptBaseClass("ScriptBaseTestScript")

        def shell = new GroovyShell(this.class.classLoader,new Binding(),configuration)

        assertEquals shell.evaluate("foo()"),"this is foo"

    }

}

abstract class ScriptBaseTestScript extends Script {

    def foo() {

        "this is foo"

    }

}

在Java中动态加载和运行Groovy脚本

你可以在Java代码中直接使用GroovyClassLoader动态地加载和执行Groovy类。Java代码如下:

ClassLoader parent = getClass().getClassLoader(); 

GroovyClassLoader loader = new GroovyClassLoader(parent); 

Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy")); 

// let's call some method on an instance
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); 

Object[] args = {}; 

groovyObject.invokeMethod("run",args);

如果你想在Java里使用一个接口,但是接口的实现在Groovy脚本中,可以这样:

GroovyClassLoader gcl = new GroovyClassLoader(); 

Class clazz = gcl.parseClass(myStringwithGroovyClassSource,"SomeName.groovy"); 

Object aScript = clazz.newInstance(); 

MyInterface myObject = (MyInterface) aScript; 

myObject.interfaceMethod(); 

...

由于原文代码比较多,所以感兴趣的同学请点击原文链接阅读。

================================================

感谢 CodingUPYUN 对本微信的支持。Coding.net 是一个面向开发者的云端开发平台,目前提供代码托管、运行空间、质量控制、项目管理等功能。

upyun.com是国内领先的云服务提供商,专注于提供静态文件的云存储、云处理和CDN加速服务。现在注册,即可免费体验!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读