- 博客(24)
- 收藏
- 关注
原创 Groovy深入探索——Groovy的ClassLoader体系
Groovy中定义了不少ClassLoader,本文将介绍其中绝大多数Groovy脚本都会涉及到的,也是最主要的3个ClassLoader:RootLoader、GroovyClassLoader和GroovyClassLoader.InnerLoader。注:以下分析的Groovy源代码来自Groovy 2.1.3。[size=x-large]Java的ClassLoader[/...
2013-04-14 22:29:02
1013
原创 Groovy学习笔记——实现Python风格的String format
在Python中提供了String format的操作符:[code="python"]print '%s: %d' % ('one', 1)[/code]在Java中则是通过String.format()方法实现:[code="java"]System.out.println(String.format("%s: %d", "one", 1));[/code]而在Groovy中,...
2013-03-11 01:27:07
1029
Groovy深入探索——DGM调用优化
DGM调用优化是通过直接调用代替反射调用的方式来提高DGM方法的调用效率。注:以下分析的Groovy源代码来自Groovy 1.8.0 rc4。[size=x-large]DGM[/size]DGM其实是Groovy社区对DefaultGroovyMethods的简称,完整类名是org.codehaus.groovy.runtime.DefaultGroovyMethods。...
2011-04-26 14:54:35
642
Groovy深入探索——Metaclass的存放
本文介绍了Metaclass在Groovy中的存放方式,并对不同的情况(Per-class Metaclass、POGO Per-instance Metaclass和POJO Per-instance Metaclass)进行了分析。注:以下分析的Groovy源代码来自Groovy 1.7.1,所有测试代码在Groovy 1.7.1下测试通过。[size=x-large]Meta...
2010-03-19 19:14:23
572
Groovy学习笔记——用inject方法构造Map
假设我们有两个List,分别是a和b,a和b的长度相同,现在我们想把a的每个元素作为key,b中对应的元素作为value,构造一个Map,应该怎么写呢?最直接的想法,先建立一个空的Map,然后往里面添加key-value对,代码如下(运用了我在[url]http://johnnyjian.iteye.com/blog/271554[/url]中提到的同时迭代多个List的技巧):[co...
2009-08-02 11:46:45
289
Gmock 0.8.0 发布
Gmock是一个基于Groovy语言的mock框架。Gmock利用了Groovy语言的特性,提供了简洁可读的语法,并且用Gmock mock出来的对象可以在Java代码中使用,所以你可以使用Java编写代码而使用Groovy和Gmock编写测试。本版本支持Groovy 1.6,但是实际上你需要使用Groovy 1.6.1,因为1.6.1修正了一些影响到Gmock的bug。本版本利用...
2009-04-21 11:43:12
122
Gmock 0.7.0 发布
Gmock是一个基于Groovy语言的mock框架。Gmock利用了Groovy语言的特性,提供了简洁可读的语法,并且用Gmock mock出来的对象可以在Java代码中使用,所以你可以使用Java编写代码而使用Groovy和Gmock编写测试。本版本加入了以下特征:1. 设定方法调用的严格顺序(strict ordering)。这是通过ordered闭包实现的。下面是一个被缓存的...
2009-03-22 10:08:33
104
Groovy深入探索——Call Site分析
Groovy 1.6引入了Call Site优化。Call Site优化实际上就是方法选择的cache。[size=x-large]方法选择[/size]在静态语言(如Java)中,方法调用的绑定是在编译期完成的(不完全是这样,如虚函数,但总的来说,静态语言的方法调用是非常高效的)。而在动态语言(如Groovy)中,调用的方法是在运行时选择的。这也是造成动态语言比静态语言慢的重要原因之...
2009-03-16 00:30:54
2059
Groovy学习笔记——实现Ruby的case .. when表达式
今天看到有人在Groovy的邮件列表上问Groovy能不能支持Ruby的case ... when表达式:[code="ruby"]car = "Patriot"manufacturer = case car when "Focus": "Ford" when "Navigator": "Lincoln" when "Camry": &qu
2009-03-12 10:54:08
1080
Gmock 0.6.0 发布
Gmock是一个基于Groovy语言的mock框架。Gmock利用了Groovy语言的特性,提供了简洁可读的语法,并且用Gmock mock出来的对象可以在Java代码中使用,所以你可以使用Java编写代码而使用Groovy和Gmock编写测试。本版本添加了以下特性:[list][*]支持mock静态属性:[/list][code="java"]def mockLoader =...
2009-02-19 20:00:48
129
Gmock 0.5.0 发布
Gmock是一个基于Groovy语言的mock框架。与Java的各种mock框架相比,Gmock利用了Groovy语言的特性,提供了更精简、更可读的语法。而与Groovy的官方解决方案——MockFor类——相比,除了更精简和可读的语法之外,用Gmock mock出来的对象是可以在Java代码中使用的,所以你可以使用Java编写代码而使用Groovy和Gmock编写测试。[size=lar...
2009-01-20 22:09:21
134
Groovy学习笔记——同时迭代多个List
假设我们有这样两个List:[code="java"]def list1 = [1, 2, 3]def list2 = [4, 5, 6][/code]我们需要检查是否第二个List的每个元素都比第一个List的对应元素大,最直接的想法是,迭代第一个List,然后通过下标访问第二个List:[code="java"]def result = truelist1.eachWith...
2008-11-20 12:30:05
689
Groovy学习笔记——闭包的递归调用
如果一个闭包被赋值给一个对象的属性(在脚本中,给一个没有定义过的变量赋值,实际上就是给这个脚本对象添加了一个属性),那么当需要对这个闭包进行递归调用的时候,可以直接使用这个属性的名字进行调用:[code="java"]// 递归求n!factorialProperty = { n -> if (n == 0) return 1 n * factorialProperty...
2008-10-30 13:43:59
705
Groovy学习笔记——改变Closure中方法的解析顺序
在Closure中,方法的默认解析顺序是,先查看owner是否包含这个方法,如果没有的话再查看delegate是否有这个方法。实际的过程要比这个复杂,因为涉及到嵌套的Closure的情况,在这种情况下,还要考虑外围的Closure的delegate。在这里就不讨论嵌套Closure的情况了,有兴趣的可以查看ClosureMetaClass.invokeMethod方法的源代码。我们可以通过Cl...
2008-10-27 11:20:49
439
Groovy+Tapestry5+Spring2.5+Hibernate3.2实现CRUD
最近在研究Tapestry5,觉得不错,所以就尝试与Spring和Hibernate整合,并使用Groovy编写,实现简单的CRUD操作。此整合的特点:1. 因为使用了Groovy,所以并没有为Service和DAO层建立接口,一切都靠方法签名的约定2. 尽量使用annotation,Spring中的依赖注入使用了JSR-250的@Resource,按照bean名字注入3. 配置很...
2008-09-03 23:32:03
174
Groovy学习笔记——在Groovy中调用Groovy脚本
之前Evan在[url]http://www.chinagroovy.org/forum/index.php?topic=291.0[/url]中问了关于如何调用一个外部的Groovy脚本中的闭包的问题,实际上这并不复杂,要比Java调用Groovy的方法简单。譬如我们有这样的脚本:[code="java"]// com/test/SomeScript.groovypackage ...
2008-09-02 20:08:50
800
Groovy学习笔记——使用with方法减少代码
假设我们有这样的代码:[code="java"]class Test { def fun1() { println 'a' } def fun2() { println 'b' } def fun3() { println 'c' }}def test = new Test()test.fun1()test.fun2()test.fun3(...
2008-08-24 10:44:47
685
Getris 1.0 发布
Getris是由本人发起的开源项目,它是一个用Groovy编写的俄罗斯方块游戏。Getris的目的是向初学者演示Groovy的各种特征,这些特征包括:[list][*]Closure[*]Groovy Bean[*]MetaClass[*]Mixin (使用关键字'use')[*]SwingBuilder[*]MarkupBuilder (用于创建XML)[*]...
2008-08-08 10:40:57
152
Groovy学习笔记——Map的key
请看如下代码:[code="java"]def a = 'b'def m = [a:a]println m // 输出[a:b][/code]输出的是[a:b]而不是[b:b],这是因为Groovy把Map的key都当作字符串处理了,即使没有加上单引号或者双引号。所以这里Map的key“a”并不是看作变量a,而是字符串"a"。要让这里的a被看作变量,需要加上圆括号或者使用GSt...
2008-05-24 19:52:24
1368
Groovy学习笔记——实现简单的C++输出风格
代码如下:[code="java"]def out = System.out // 也可以用import static System.out as outdef endl = '\n'out
2008-05-15 19:30:43
195
Groovy学习笔记——times方法
在写程序的时候,可能需要用到0到n-1的循环,一般的写法是:[code="java"]for (i = 0; i < 5; ++i) { println i}[/code]或者更Groovy的写法:[code="java"]for (i in 0.. println i}[/code]但是用times方法来做0到n-1的循环可能会影响语义,所以最好还是根...
2008-05-14 08:38:45
840
Groovy学习笔记——读取类的函数签名的脚本
今天写了个读取类的函数的签名的脚本,供学习之用,其实最主要是想看看Groovy都给类添加了些什么函数。代码就二十多行,从中又可以体现出Groovy代码之精炼 PrintClass.groovy:if (args) { def className = args[0] def theClass = Class.forName(className) def theM...
2008-02-04 17:45:32
309
Groovy学习笔记——as操作符
在Groovy中,as操作符有两种用途:定义导入别名和类型转换。 1. 定义导入别名只要在import一个类或方法的时候使用as操作符,就可以对其进行重命名:import java.lang.Math as M // 定义类的别名assert M.log10(100) == 2import static M.log10 as log // 定义方法的别名assert log...
2008-01-31 19:31:15
1702
Groovy学习笔记——利用Groovy的动态特性删除属性
利用Groovy的动态特性,不但可以给类添加属性(http://www.blogjava.net/BlueSUN/archive/2007/07/15/130318.html),还可以删除类的属性。代码如下:class A { String attToRemove int otherAtt}def a = new A()a.attToRemove = 1pr...
2008-01-12 17:28:13
862
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人