原文链接  译者: 李璟(jlee381344197@gmail.com)

(本站正在翻译groovy系列文章,有兴趣同学可以加入我们)

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

...

如果这个Groovy类实现了接口MyInterface,这么做是没有问题的。从现在开始myObject可以像其他实现了MyInterface接口的类一样使用。

需要注意的一点是,parseClass 方法会从你的字符串文件名中创建一个对象。另一个gcl.parseClass的用法是:

Class clazz = gcl.parseClass(new File("SomeName.groovy");

完整的例子如下所示:

TestInterface.java

public interface TestInterface {

public void printIt();

}

Tester.groovy

public class Tester implements TestInterface {

public void printIt() {

println "this is in the test class";

}

}

TestClass.java -- inside of a method

String fileName = "Tester.groovy";

GroovyClassLoader gcl = new GroovyClassLoader();

Class clazz = gcl.parseClass(new File(fileName));

Object aScript = clazz.newInstance();

TestInterface ifc = (TestInterface) aScript;

ifc.printIt();

请注意,所有的异常处理都已经被移除了,你不必在Java类中关心这个。实际上我会在一个工具类中完成Groovy的接口调用。

GroovyScriptEngine

如果开发人员想把Groovy脚本嵌入到服务器内,并且在脚本变更之后也能够重新加载,GroovyScriptEngine是一个主要的解决方案。你可以使用一个CLASSPATH集合(url或者路径名称)初始化GroovyScriptEngine,之后便可以执行这些路径中的Groovy脚本了。GroovyScriptEngine同样可以跟踪相互依赖的脚本,如果其中一个被依赖的脚本发生变更,则整个脚本树都会被重新编译和加载。

此外,每次脚本的执行,还可以利用一个脚本可以访问的包含了最新参数的Binding对象传递信息。例子如下:

/my/groovy/script/path/hello.groovy:

output = "Hello, ${input}!"

import groovy.lang.Binding;

import groovy.util.GroovyScriptEngine;

String[] roots = new String[] { "/my/groovy/script/path" };

GroovyScriptEngine gse = new GroovyScriptEngine(roots);

Binding binding = new Binding(); binding.setVariable("input", "world");

gse.run("hello.groovy", binding); System.out.println(binding.getVariable("output"));

输出是“Hello, world!”。

在Java应用程序中嵌入Groovy控制台

运行时的依赖

你可以把groovy-all-x.y.z.jar拷贝到Groovy的安装目录中,也可以从Gradle / Maven / Ant+Ivy中查找相应的包的路径执行构建。关于如何获取Groovy,请查看download小节。

java 嵌入groovy_嵌入Groovy相关推荐

  1. 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

    文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...

  2. 词嵌入 网络嵌入_词嵌入简介

    词嵌入 网络嵌入 深度学习 , 自然语言处理 (Deep Learning, Natural Language Processing) Word embedding is a method to ca ...

  3. java调用、执行groovy代码

    java调用.执行groovy代码 1: package test; 2: 3: import javax.script.ScriptEngine; 4: import javax.script.Sc ...

  4. Java Lambda流和Groovy Clouse的比较

    这篇博客文章将探讨List数据结构上的一些谚语操作,并对Java 8/9和Groovy语法进行一些比较. 因此,首先是数据结构. 这只是一个简单的橄榄球球员,有名字和等级. Java class Ru ...

  5. java 调用groovy_Java调用Groovy脚本

    在idea下,标准的Java maven项目中展示如何调用Groovy脚本和方法. maven项目引进Groovy lib File -> Project Structure -> Glo ...

  6. 词嵌入 网络嵌入_深入研究词嵌入以进行情感分析

    词嵌入 网络嵌入 When applying one-hot encoding to words, we end up with sparse (containing many zeros) vect ...

  7. 既生Java,何生Groovy?

    这周接手了组里一个旧项目,Javadoc显示这是从2017年开始编写,@author显示的是一位前端员工的名字,他在我入职前已离职,好像是去了腾讯. 我十分好奇,为什么前端人员的名字会出现在后台代码里 ...

  8. 教妹学 Java:动态伴侣 Groovy

    点击上方"程序员小明",选择"星标" 今晚可以不加班! 00.故事的起源 "二哥,听说上一篇<多线程>被 CSDN 创始人蒋涛点赞了?&q ...

  9. 词嵌入 网络嵌入_词嵌入深入实践

    词嵌入 网络嵌入 介绍 (Introduction) I'm sure most of you would stumble sooner or later on the term "Word ...

最新文章

  1. OpenCV 【十八】图像平滑处理/腐蚀与膨胀(Eroding and Dilating)/开闭运算,形态梯度,顶帽,黑帽运算
  2. 搭建yum源,配置yum源
  3. 一键发布部署vs插件[AntDeploy],让net开发者更幸福
  4. GeoMesa-空间数据存储引擎入门学习手册
  5. cordova插件开发
  6. 正反案例介绍SOLID原则
  7. Spring Reactive已经过时了吗? 螺纹连接反转
  8. maxcompute 2.0复杂数据类型之array
  9. dubboSPI机制浅谈
  10. 【MFC】遍历文件夹及其子文件夹
  11. Java并发(七)——并发容器
  12. Flash: 涅磐与重生
  13. F2工作流引擎之 概述(一)
  14. 【元胞自动机】基于matlab元胞自动机超车换道【含Matlab源码 359期】
  15. 音视频处理、图像处理、图像识别和字符识别全能库JavaCV完整教程(包含完整JavaCV入门、JavaCV实战、ffmpeg、opencv和tesserac教程)
  16. 金三银四,教你编写一份脱颖而出的简历,从而 offer 手到擒来,要参加校招的同学要提前准备了
  17. ITOM(IT运维管理软件)
  18. linux c 编译 未定义的引用,c – Linux makefile中的未定义引用
  19. Linux课程project----基于c/c++
  20. matlab绕圆柱有环量流线,绕圆柱无环量和有环量流动流线分布图

热门文章

  1. 域名抢注,域名交易平台(国内国外)
  2. 直流电机调速c语言源程序,直流电机调速源程序示例
  3. 书单收藏 | 17本中信版畅销书从科普、商业到技术带你轻松理解区块链
  4. 【数据挖掘】鸢尾花分析实验与数据降维
  5. html个性花边代码,十种漂亮的多层花边边框代码
  6. 就业协议服务器是什么意思,什么是就业协议
  7. 入门机器学习需要会哪些编程语言?
  8. 人机对话_javaweb_ 一对一聊天系统
  9. c语言二级的作用是什么,c语言二级模拟考试
  10. 修复Ubuntu文件系统