`

【转】Java中用groovy

 
阅读更多

http://tglnn.iteye.com/blog/376978

 

很多情况下,Groovy是执行某一类任务的理想工具,如快速原型开发设计(rapid prototyping)或创建可由宏指令(macros)或插件(plug-ins)扩展的模块应用。这些扩展可以用Groovy实现,而不需冗长乏味的开发部署周期便可嵌入到您的应用程序中。相信,Groovy极富表现力,其简洁性和强大特性会给您的程序开发带来很大的好处。

在其他情况下,Groovy或许不是最好的选择。这一点对高性能要求极高的应用尤其适用,因为在灵活性和运行速度之间权衡取舍是不可避免的。

Groovy最大的亮点便是与Java的完美集成。Groovy的灵活性和机动性,让开发者至少可以通过5种方式实现与Java集成,当然各种方式均有其优缺点。下面章节将详细讨论这5种集成方式,并给出各种方式的适用条件。

编译成字节码(Compiling to Bytecode)

最简单直接的集成方法便是把Groovy文件编程成Java字节码(即.class文件),并能够在Java类路径(class path)获取这些文件。这种方式也有弊端:一方面您必须首先编译所有的Groovy文件,而与此同时,部分Groovy文件中引用了其他的Java类同样也需要先被编译,这时便会出现编译问题。

使用GroovyShell(Using GroovyShell)

GroovyShell允许在Java类中(甚至Groovy类)求任意Groovy表达式的值。您可使用Binding对象输入参数给表达式,并最终通过GroovyShell返回Groovy表达式的计算结果。清单2.19展示了如何使用GroovyShell。

清单2.19 GroovyShell应用

 

import groovy.lang.Binding;

import groovy.lang.GroovyShell;

 

public class GroovyShellExample {

 

  public static void main(String args[]) {

    Binding binding = new Binding();

    binding.setVariable("x", 10);

    binding.setVariable("language", "Groovy");

    GroovyShell shell = new GroovyShell(binding);

    Object value = shell.evaluate

      ("println \"Welcome to $language\"; y = x * 2; z = x * 3; return x ");

    assert value.equals(10);

    assert binding.getVariable("y").equals(20);

    assert binding.getVariable("z").equals(30);

  }

}

 

GroovyShell是推求动态类型表达式的有效工具。典型的应用就是推求用户输入Groovy动态表达式的值,通常会有一个用户界面(user interface,UI),如电子表格程序(spreadsheet application)。

使用GroovyScriptEngine(Using GroovyScriptEngine)

GroovyShell多用于推求对立的脚本或表达式,如果换成相互关联的多个脚本,使用GroovyScriptEngine会更好些。GroovyScriptEngine从您指定的位置(文件系统,URL,数据库,等等)加载Groovy脚本,并且随着脚本变化而重新加载它们。如同GroovyShell一样,GroovyScriptEngine也允许您传入参数值,并能返回脚本的值。

假设您有一个简单的Groovy 脚本,C:\tmp\SimpleScript.groovy,具体如下:

//SimpleScript.groovy

println "Welcome to $language"

return "The End"

 

清单2.20演示了如何传入参数给GroovyScriptEngine,并执行SimpleScript.groovy脚本,然后返回一个值。

 

清单2.20 GroovyScriptEngineExample.java

import groovy.lang.Binding;

import groovy.util.GroovyScriptEngine;

 

public class GroovyScriptEngineExample {

 

  public static void main(String args[]) {

    try {

      GroovyScriptEngine engine = new GroovyScriptEngine("");

      Binding binding = new Binding();

      binding.setVariable("language", "Groovy");

      Object value = engine.run("SimpleScript.groovy", binding);

      assert value.equals("The End");

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

 

尽管GroovyScriptEngine是执行多个Groovy脚本的有效方法,但仍不能妥善处理复杂类。对于同时处理Groovy类和脚本的情况,最完善的解决方案便是GroovyClassLoader(其实,GroovyShell和GroovyScriptEngine都会用到它)

 

使用GroovyClassLoader(Using GroovyClassLoader)

GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。它也能编译。清单2.21展示了如何使用GroovyClassLoader加载Groovy类并且调用该类的一个方法。

 

清单2.21 GroovyClassLoader应用

//GroovySimpleFileCreator.groovy

 

class GroovySimpleFileCreator {

  public createFile(String fileName){

    File file = new File(fileName);

    file.createNewFile();

  }

}

 

//GroovyClassLoaderExample.java

 

import groovy.lang.GroovyClassLoader;

import groovy.lang.GroovyObject;

 

import java.io.File;

 

public class GroovyClassLoaderExample{

 

  public static void main(String args[]) {

    try {

      GroovyClassLoader loader = new GroovyClassLoader();

      Class fileCreator = loader.parseClass

        (new File("GroovySimpleFileCreator.groovy"));

      GroovyObject object = (GroovyObject) fileCreator.newInstance();

      object.invokeMethod("createFile", "C:\\temp\\emptyFile.txt");

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

 

使用GroovyClassLoader典型的情景之一便是:您有一个Java接口和一个实现该Java接口的Groovy类。因此,您可以使用GroovyClassLoader加载Groovy实现类到应用中,这样便可直接调用接口的方法了,清单2.22给予形象地说明。

清单2.22 在Groovy中实现Java接口

//Shape.java:

 

public interface Shape{

  int calculateArea();

}

 

//Square.groovy:

 

class Square implements Shape {

 

  def x;

  int calculateArea(){

    return x * x;

  }

}

 

// GroovyClassLoaderExample2.java

 

import groovy.lang.GroovyClassLoader;

import groovy.lang.GroovyObject;

 

import java.io.File;

 

public class GroovyClassLoaderExample2{

 

  public static void main(String args[]) {

    try {

      GroovyClassLoader loader = new GroovyClassLoader();

      Class groovyClass = loader.parseClass(new File("Square.groovy"));

      GroovyObject object = (GroovyObject) groovyClass.newInstance();

      object.invokeMethod("setX", 10);

      Shape shape = (Shape) object;

      assert shape.calculateArea() == 100;

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

 

使用JSR 223(Using JSR 223)

如果您正在使用Java 6,就可以选择使用Sun’s Java Specification Request(JSR) 223:Scripting for the Java Platform。使用JSR 223可使您的应用与特定的脚本引擎实现很好的分离,使您轻松更换脚本语言。如果您想在Java代码中使用其他的脚本语言(如BeanShell或JRuby),还是推荐使用JSR 223。如果您没有使用Java 6而且还想选择多脚本语言混合编程,可以参考Apache’s Bean Scripting框架:http://jakarta.apache.org/bsf。除非要做到您的应用与特定的脚本引擎很好的解耦,否则使用Groovy自带的方式相对比较灵活些。

清单2.23展示了如何使用JSR223集成Groovy。您必须保证groovy-engine.jar文件已经在您的类路径中。您可到https://scripting.dev.java.net下载该jar文件。这个例子演示了如何调用Groovy方法,传递参数和返回一个值。

 

清单2.23 使用JSR 223

import javax.script.Invocable;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

 

public class GroovyJSR223Example {

 

  public static void main(String args[]) {

    try {

      ScriptEngineManager factory = new ScriptEngineManager();

      ScriptEngine engine = factory.getEngineByName("groovy");

      String HelloLanguage = "def hello(language) {return \"Hello $language\"}";

      engine.eval(HelloLanguage);

      Invocable inv = (Invocable) engine;

      Object[] params = { new String("Groovy") };

      Object result = inv.invokeFunction("hello", params);

      assert result.equals("Hello Groovy");

    } catch (Exception e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

    }

  }

}

分享到:
评论

相关推荐

    java中用spring boot连接oracle数据库代码下载

    ```groovy implementation 'com.oracle.database.jdbc:ojdbc8:19.7.0.0' ``` 2. 配置数据源 在`application.properties`或`application.yml`文件中,配置Oracle数据库的连接信息。例如: ```properties spring....

    groovy-2.1.4.zip

    Groovy与Java紧密集成,可以无缝地在Java项目中使用,且编译成与Java字节码兼容的格式,使得它可以运行在任何支持Java的环境中。 描述中的"vertx-hk2.zip" 提到了Vert.x和HK2两个关键概念。Vert.x是一个轻量级、高...

    groovy入门实例代码详细(包括字符串,map,闭包等等)

    - Map在Groovy中用于存储键值对,创建Map的语法是`[key1: value1, key2: value2]`。 - Map的键值可以通过`.`或`[]`来访问,如`map.key1`或`map['key1']`。 - Map也支持`each`循环遍历键值对。 5. **闭包**: - ...

    轻松看懂Java字节码.pdf

    7. 其他JVM语言:由于JVM平台的灵活性和强大的字节码支持,除了Java之外,还有很多基于JVM的编程语言,例如Groovy、Scala、Kotlin等,它们可以利用Java字节码的特性提供一些Java所不支持的高级语言特性。 8. 字节码...

    梳理的一些java开发中用上的框架和开发工具,肯定会遗漏,欢迎补充

    Gradle 是一款基于Groovy语言的构建工具,支持增量构建以及多语言项目。 - **Bazel**: 工具。Bazel 是Google开源的构建工具,适用于大规模软件工程。 #### 代码质量检查 - **Checkstyle**: 工具。Checkstyle 是一个...

    阿里云公网redis集群搭建以及java访问redis集群

    这些信息将在后续的Java访问中用到。 二、Java访问公网Redis集群 1. 添加依赖:在Java项目中,我们需要引入JedisCluster库,可以通过Maven或Gradle添加以下依赖: Maven: ```xml <groupId>redis.clients ...

    Jasperreports6.3.1所依赖的Jar集合

    6. **Hibernate3.jar**:Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,可能在JasperReports中用于数据持久化和报表数据的加载。 7. **Xbean.jar**:Apache XBean是一个轻量级容器,提供...

    Android Studio中用GreenDAO

    ```groovy dependencies { implementation 'org.greenrobot:greendao:3.3.0' } ``` 同步Gradle后,GreenDAO库将自动下载并加入到项目中。 **2. 创建实体类** GreenDAO通过实体类来映射数据库表。创建一个实体类,...

    java 操作excel的poi需要的jar包

    - `poi-scratchpad-3.11.jar`: 一些实验性的和未完成的功能会放在这里,一般开发中用到的不多,但有时候可能需要用到其中的一些功能。 - `poi-ooxml-lite-3.11.jar`: 是一个轻量级版本,包含了处理.xlsx文件的基本...

    Gradle User Guide

    - Groovy基础:介绍Groovy语言的基础知识,强调在Gradle脚本编写中用到的特性。 12. 教程:“这个和那个” - 目录创建:如何在构建过程中创建目录。 - Gradle属性和系统属性:如何在Gradle中设置和使用属性。 -...

    andorid SQLite操作

    ```groovy dependencies { implementation 'androidx.room:room-runtime:2.4.3' kapt 'androidx.room:room-compiler:2.4.3' // 如果使用Kotlin // 或者 annotationProcessor 'androidx.room:room-compiler:2.4.3...

    ofbiz插件:Apache OFBiz是用于企业流程自动化的开源产品。 它包括用于ERP,CRM,电子商务,供应链管理和制造资源计划的框架组件和业务应用程序。 OFBiz为可靠,安全和可扩展的企业解决方案提供了基础和起点

    **Groovy**是一种动态的、基于Java平台的脚本语言,常用于简化OFBiz中的开发任务,提高代码的可读性和可维护性。Groovy与Java的互操作性使其成为OFBiz中的理想补充工具。 **Database**管理是OFBiz的基础,它支持...

    Activiti5.21依赖库

    2. **Groovy**: `groovy-all-2.4.5.jar` 提供了Groovy语言的支持,Activiti允许使用Groovy脚本来定义业务规则和行为,这使得流程定义更灵活,代码更简洁。 3. **Vaadin**: `vaadin-6.8.8.jar` 是一个用于构建现代...

    ant帮助文档ant帮助文档ant帮助文档

    - 属性在Ant中用于存储可重用的值,通常用于配置路径、版本号等。`<property>`标签用于设置属性,如`<property name="src.dir" value="src"/>`。 4. **依赖关系(Dependencies)** - Ant的任务可以有依赖关系,一...

    百度LBS平台Android定位功能开发源码(简单Demo)

    这个密钥将在定位请求中用到,以验证应用的身份。 三、初始化定位服务 在应用的入口类(如`Application`或`MainActivity`)中,初始化定位服务: ```java public class MyApplication extends Application { @...

    Android开发实现QQ登录

    这两个参数是身份验证的关键,会在后续的登录流程中用到。 接着,在Android项目中引入QQ SDK。你可以通过Gradle依赖管理来添加SDK,将以下代码添加到build.gradle文件的dependencies块中: ```groovy ...

    安卓Android源码——写的googlemapapi应用.zip

    然后,为应用生成一个API密钥,这将在AndroidManifest.xml中用于配置Maps API。 3. **在布局文件中添加MapView** 在XML布局文件中,我们需要添加一个`MapView`组件,这是显示地图的容器。例如: ```xml ...

    Android多图滑动浏览 支持手势缩放

    然后,你需要在布局XML文件中用`Photoview`替换普通的`ImageView`。例如: ```xml android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 接下来,你...

    Android应用发布后的统计——百度移动统计的应用

    这个AppKey将在之后的SDK集成过程中用到。 接下来,**集成BMA SDK** 。将BMA的SDK库文件添加到Android项目的依赖中,可以通过Gradle构建系统引入。在`build.gradle`文件中添加如下依赖: ```groovy dependencies {...

    android学习之短信验证码

    ```groovy dependencies { implementation 'com.ucpaas:ucpaas-android-sdk:版本号' } ``` 完成依赖添加后,需要在AndroidManifest.xml中添加必要的权限,包括网络访问和接收短信: ```xml ``` 接下来,创建...

Global site tag (gtag.js) - Google Analytics