Groovy
matico
一个老程序员
展开
-
在多线程环境下使用AtomicInteger
Groovy和Java相容,支持多线程编程方面肯定没有什么问题,只是语法上更便利了些。本示例说明如何使用AtomicInteger来实现并发计数。 import java.util.concurrent.atomic.AtomicIntegerdef counter = new AtomicInteger()//打印输出方法,要同步!synchronized out(mes翻译 2008-12-29 13:19:00 · 1980 阅读 · 0 评论 -
自由的属性
参见如下例子://定义一个类class Expandable { def storage = [:] def getProperty(String name) { storage[name] } void setProperty(String name, value) { storage[name] = value }}//实例化def e = new Expandable()/原创 2008-12-12 23:05:00 · 242 阅读 · 0 评论 -
了解一下gant
Gant就是用Groovy来实现ant,脚本本身的灵活和优雅,使得Gant比直接用Ant存在很多优势。仅通过一个例子来说明,运行这个例子,需要准备Gant环境,这里不细说了。创建一个文本文件:BuildTest.gant,内容如下://定义两个目录sourceDirectory = sourcebuildDirectory = build//引用一个内置的定义in原创 2008-12-15 14:41:00 · 556 阅读 · 0 评论 -
仔细研究一下方法调用和属性存取
仔细研究一下方法调用和属性存取。通过为一个类添加方法 invokeMethod 可以有机会执行原本未定义的方法,示例如下。class MyClass{ def hello(){ invoked hello directly } def invokeMethod(String name, Object args){ return "unknown method $name(${翻译 2008-12-17 18:08:00 · 307 阅读 · 0 评论 -
Function和Closure的区别
Groovy中,function和closure非常相似,不过还是有区别,通过示例来说明。1)函数体内不能访问上下文中通过def定义的变量a = 32 //def keyword not used for this one, 这个变量可以在下面的函数中访问到def c = there, d = yonderdef f(){ assert a == 32 //outer a vis翻译 2008-12-22 12:12:00 · 570 阅读 · 0 评论 -
MetaClass深入研究-2
//可以从从Class层面来设定MetaClass,示例如下:public class MyMetaClass extends DelegatingMetaClass{ MyMetaClass(Class theClass){ super(theClass) } Object invokeMethod(Object object, String methodName, Object翻译 2008-12-21 00:41:00 · 270 阅读 · 0 评论 -
MetaClass深入研究-3
本篇中将看到,与自定义的Class不同,如果设置Groovy内置的Class的MetaClass,将影响到所有该类的实例,不管是在什么时候创建的实例。public class MyMetaClass extends DelegatingMetaClass{ MyMetaClass(Class theClass){ super(theClass) } Object invokeMet翻译 2008-12-21 00:44:00 · 278 阅读 · 0 评论 -
MetaClass 深入研究-5
在对MetaClass有所了解之后,本篇重点看看ExpandoMetaClass 的灵活性。ExpandoMetaClass是一种MetaClass的实现,缺省情况下,一个自定义的类的MetaClass实现是MetaClassImpl,不过这个实现类并不稳定,见下面的示例。class A{ String text}def a1= new A(text: aBCdefG)assert a1翻译 2008-12-21 21:52:00 · 301 阅读 · 0 评论 -
MetaClass深入研究-1
缺省MetaClass的方法调用表现,有静态定义则走静态定义,没有静态定义则进行动态调用,见如下代码:class A{ def bark(){ A: invoked bark() } def invokeMethod(String name, Object args){ "A: missing $name(${args.join(, )})" }}def a= new A()原创 2008-12-19 17:47:00 · 296 阅读 · 0 评论 -
MetaClass 深入研究-4
本篇中将看到,通过invokeConstructor甚至可以修改构造函数的返回对象public class MyMetaClass extends DelegatingMetaClass{ MyMetaClass(Class theClass){ super(theClass) } Object invokeConstructor(Object[] arguments){ []原创 2008-12-21 21:51:00 · 254 阅读 · 0 评论 -
使用 methodMissing & propertyMissing
使用 methodMissing & propertyMissing自从版本1.5 ,Groovy开始支持 "methodMissing",熟悉MetaClass机制后,从这个名字不难看出这个是用来干什么的,就是当找不到某个方法的时候,这个方法就会被调用。一般说来,既然已经有invokeMethod了,那么为什么还要”多此一举“呢?下面是使用这个特性的一些准则:这个特性只发生在常规方法分配翻译 2008-12-23 17:33:00 · 394 阅读 · 0 评论 -
Groovy 中变量的作用域
Groovy由于提供了Closure的支持,对变量作用域来说,和Java有些不同。主要体现为两点:1)Closure对外部局部变量有访问能力;2)脚本中隐含存在一个binding变量 通过例子来说明: 1)方法屏蔽外部局部变量String attribute = "bar"void aMethod(){ assert attribute == "bar" /原创 2008-12-24 12:20:00 · 1487 阅读 · 0 评论 -
如何从外部获取Class属性值得问题
在Grails里,通过定义DomainClass来对业务对象建模,那么在进行代码生成的时候,是如何获得这些模型的呢?本文做一些初步的探讨。下面定义一个类: class A{ static def attr1 = "bar" def attr2 = "foo" }通过脚本,如何能获得attr1, attr2的值呢。 最简单的方法: def a = ne原创 2008-12-25 13:12:00 · 517 阅读 · 0 评论 -
用Closure来作为测试Mock
使用Groovy提供的Closure可以非常方便地实现测试Mock .见下面示例: 首先定义几个接口:interface Logger { def log(message) }interface Helper { def doSomething(param) }interface Factory { Helper getInstance() } 测试的目标是下面这个M翻译 2008-12-27 23:05:00 · 312 阅读 · 0 评论 -
使用Map或Expando来替代Mock
类似一篇文章的例子,假设我们要测试下面这个逻辑:class MyApp { def factory def logger def doBusinessLogic(param) { def myObj = factory.instance myObj.doSomething(param) myObj.doSomethingElse(pa翻译 2008-12-28 21:54:00 · 339 阅读 · 0 评论 -
Groovy SQL
本例子说明如何通过Groovy执行SQL先看一下这个例子:piEstimate = 3;println("Pi is about ${piEstimate}");println("Pi is closer to ${22/7}");这个例子显示出,在串中,用${}可以进行表达式计算。这个特性在下面要经常用到。例子1:执行简单查询看下面的3行代码:import groovy.sql.翻译 2008-12-16 17:19:00 · 905 阅读 · 0 评论 -
Groovy脚本间的调用
一个Groovy脚本,如果不显示来声明类名,那么默认生成一个和文件名同名的类,并自动生成main函数,脚本中的语句都自动放置在main函数中。见下面例子:创建一个脚本文件:sample.groovy,内容为:println "Hello, world !"println "Args is : " + args 再在同一个目录下创建另一个脚本文件:caller.groovy原创 2008-12-14 21:56:00 · 562 阅读 · 0 评论 -
并发计算
并发计算可以有效提高计算效率,尤其在多CPU情况下,本示例说明一种并发计算的实现方法。这个例子用来计算Fibonacci 数列。 import java.util.concurrent.*CUTOFF = 12 // 对太小的值不值得采用并发计算,所以设定一个限定值THREADS = 100println "Calculating Fibonacci sequence翻译 2008-12-29 13:23:00 · 608 阅读 · 0 评论 -
Groovy对Object的增强
Groovy 对 Object进行了统一的增强,本例子具体关注一下。 def a = 1..10println "any"a.any { println it ; it >5 }println "every"a.every { println it ; it >5 }println "each"a.each { println it}println "eachWithInd原创 2008-12-31 17:28:00 · 429 阅读 · 0 评论 -
Groovy,一个非常好的动态语言
个人认为,Groovy是一门非常好的动态语言。语法和Java兼容,可以认为Java语法是Groovy的子集;简洁、实用的动态语法,功能非常强大;可以编译成为Java Class,具备效率优势;具备众多的子开源项目,发展前景不可限量。已经研究Groovy一段时间了,也积累了一些经验,近期打算在这里写一些东西,搜集整理一些Groovy的资料。原创 2008-11-27 23:14:00 · 314 阅读 · 0 评论 -
第一个例子
这行代码:{parm->println "Hello ${parm}"}.call("World")会输出: Hello World体现了Groovy语法的基本特点,也体现了Groovy和Java语法上的差异。{},在Groovy里,不再是Java里一个用来组合语句的简单括号,而是代表了一个匿名的函数,这个函数还可以有参数。在这个例子中,parm就是一个参数,在函数体中,采用原创 2008-11-28 23:14:00 · 255 阅读 · 0 评论 -
打印 “Hello, World”的4种方式
在Groovy中,字符串处理是非常方便的,有很多种方式可以选择。import groovy.text.Templateimport groovy.text.SimpleTemplateEngine/** 打印 Hello, World**///1{ name -> println "Hello, " + name }.call("World"); //2def f = {print原创 2008-11-29 23:48:00 · 706 阅读 · 0 评论 -
接口方面的支持
Groovy 对接口方面的支持比Java灵活多了,是否过于灵活了?看下面的示例: //1new Thread( {println "running"} as Runnable ).start(); 这个例子说明,一个“{}”,你想把它做什么接口调用,就可以做什么接口来调用,完全不受名字的限制。 //2 interface X{ void f(); void g(int原创 2008-12-02 17:59:00 · 223 阅读 · 0 评论 -
逻辑表达式
Groovy对逻辑表达式的支持也不是一般的简单,看下面的例子: println "apple" ==~ /apple/println "apple" ==~ /apple*/macher = ("a big apple , apple" =~ /appl?/)println macher[0] + "," + macher[1]这里引入了新的运算符: “==~” 来进行逻辑表原创 2008-12-01 22:47:00 · 264 阅读 · 0 评论 -
如何调用外部进程
Groovy 调用外部命令十分方便,看下面的例子://定义命令//注:这里通过cmd/c 来调用,否则Groovy不能应用操作系统的Path系统变量,就只能调用内部命令def command = """cmd /c grails"""//通过字符串的execute方法即可直接运行命令def proc = command.execute() //输出命令执行原创 2008-12-03 11:53:00 · 301 阅读 · 0 评论 -
Groovy 如何通过BSF来调用脚本
这个例子简单说明Groovy中如何使用 BSF来调用脚本 import org.apache.bsf.BSFManager; //定义一个简单的脚本,脚本返回一个数组String myScript = "println(Hello World)/n return [1, 2, 3]"; //构建BSFManagerBSFManager manager = new原创 2008-12-05 15:15:00 · 430 阅读 · 0 评论 -
便利的文件读取
Groovy 提供了文件读取更便利的方式,看下面两个例子:例子一:new File("sample.txt").eachLine { line -> println(line) }上述代码打开一个文件,然后打印每一行 例子二:new File("sample.txt").withReader { reader -> while (true) { def line = read原创 2008-12-08 15:28:00 · 244 阅读 · 0 评论 -
XML操作
Groovy实现XML文件生成非常直观方便,见下面例子: import groovy.xml.MarkupBuilder//定义一个文件def out = new File(out.xml)def writer = new FileWriter( out )def xml = new MarkupBuilder( writer )def map = ["01":"刘备","0原创 2008-12-09 22:05:00 · 225 阅读 · 0 评论 -
对模板的支持
在代码生成技术里,模板是非常有用的工具。Groovy对模板提供非常便利的支持,见如下示例: import java.io.Fileimport groovy.text.Templateimport groovy.text.SimpleTemplateEngine //定义一个Mapdef binding = ["firstname":"Sam", "lastname"原创 2008-12-10 16:26:00 · 243 阅读 · 0 评论 -
再次体会Closure的灵活性
上一篇文章中,体现了Groovy 对XML生成的灵活性,这种灵活性是怎么实现的呢,通过下面例子可以看出,实现方法很简单。 定义一个类: class XmlBuilder { def out XmlBuilder(out) { this.out = out } def invokeMethod(String name, args) { out " //如果参数是Closure,原创 2008-12-11 12:51:00 · 239 阅读 · 0 评论 -
MetaClass
Groovy 提供了一个MetaClass,来提供对对象的结构解析。先看一个例子: class Foo { String prop def bar() { "bar" } def bar(String name) { "bar $name" } def add(Integer one, Integer two) { one + two}}//实例化一个类def f = new Fo原创 2008-12-13 22:04:00 · 287 阅读 · 0 评论 -
each能够终止吗
我们知道,通过each可以非常方便的遍历数组或列表中的元素,那么each的过程,是能够被中止的吗?通过示例来研究一下://在list中找到一个元素int target = 2def list = 1..5 list.each{ println it if(it == target) { return true; //no use } } 可以发现,通过return t原创 2008-12-26 12:23:00 · 578 阅读 · 0 评论