论坛首页 编程语言技术论坛

学习Groovy,紧紧把握一点就可以了

浏览 6126 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-15  

用过Groovy的童鞋估计更多被其光鲜的语法外表吸引了——在现在编译技术和产品丰富且成熟的情况下,创造一个编程语言更多体现在设计的理念的区别——先写了几句废话。。。

 

切入正题,常用Groovy的童鞋应该经常看gapi和groovy-jdk-api,groovy-sdk的源码也是比较容易看懂的,我就目前自己掌握的东东,总结下分享给大家,有不到之处,请大家多拍砖

 

1. 设计思路上

.依靠JVM这棵大树

.汲取众多**高级语言的语言特性使得在语言功能层面强大

具体通过,扩展基础API,提供常用的工具包,支持高级编程方式(或协议?)

特性列举如:纯OO,更丰富和灵活的操作符,灵活的类型转换机制,正则,闭包等支持,MOP的扩展方式

.依附标准,利用java生态园的库以粗粒度的形式提供一些具体的解决方案和集成方法

如Groovy Modules,Ant Task,BSF,java6的ScriptEngin

 

2. 和Java集成上

大家可能读到Groovy和Java相互操作、调用的一些文章和demo——其实哪有所谓的相互,完全都是vm的class之间的调用么——这句话要避嫌——底层都是C和汇编呢

 

先列举几个常用的Java引用Groovy的类,就像Java使用任何一个第三方库的方式一样

 

Top

GroovyEngine
Script
Eval

  Level 1/2

  GroovyShell

  Level 3

  GroovyClassLoader.parseClass

 

比较眼熟吧,稍微看下groovy的源码——我们就会最终汇总到一处,就是 GroovyClassLoader——把另外一个语法语言(Groovy)编译(AST)成目标语言(.class),在JVM上,这就是唯一的通路。GroovyClassLoader,这个就是题目提到的“紧紧把握一点”了。如果你要引入groovy到你的项目上,到现有的产品里,不要紧盯着Spring提供的Groovy**BeanFactory,或者用一个BSF,(当然javax.script更官方)读GroovyClassLoader的API,你会达到你想要的一切。

 

另外就是Groovy语言上的学习,无非是语法、技能的熟练、经验的积累,我推荐下面几个做参考,剩下就要多练习了



具体对groovy性能啊,动态使用或编译后使用等等东西的讨论就不再这个blog里赘述了,网上一堆,喜欢groovy的童鞋,继续去多实践吧!

 


 

   发表时间:2012-08-15  
想起了那句,给你糖,甜到你忧伤,哈哈

动态语言的优越性不说,groovy写代码时候真是很爽的
我们项目中目前只是一次性操作与打杂的事情交给groovy了
0 请登录后投票
   发表时间:2012-08-16  
groovy on grails 忧伤的飘过..
0 请登录后投票
   发表时间:2012-08-16  
take 写道
groovy on grails 忧伤的飘过..


用自己喜欢的就好——我个人认为grails有点重——学习ROR COC等思想当然很好,其实只是简单用好groovy的一些基本功能和api就可以使得开发变得很简单和快速,尤其针对一钟应用做些良好的实践方式和工具,groovy的灵活性和优势就体现的很明显。

编程是种技能,语言是个工具,什么样的工具是其次,重要的是使用工具的人对工具的熟悉程度,深入了解以充分发挥其价值——希望熟悉和学习groovy的朋友一起多交流,多做分享,一起学习进步。
0 请登录后投票
   发表时间:2012-08-17  
大家可能读到Groovy和Java相互操作、调用的一些文章和demo——其实哪有所谓的相互,完全都是vm的class之间的调用么——这句话要避嫌——底层都是C和汇编呢


为什么java编译成可执行文件后依然需要jre,难道类库不是一起编译的吗?
0 请登录后投票
   发表时间:2012-08-17   最后修改:2012-08-17
somefuture 写道
大家可能读到Groovy和Java相互操作、调用的一些文章和demo——其实哪有所谓的相互,完全都是vm的class之间的调用么——这句话要避嫌——底层都是C和汇编呢


为什么java编译成可执行文件后依然需要jre,难道类库不是一起编译的吗?


你这扯的是另外的东东——我讲的是jvm上的动态语言(groovy)和java class交互的本质是GroovyClassloader先将.groovy编译成.class然后再和其他class进行交互的,不管所谓的有没有main,外包装的语法糖多么简洁等。
0 请登录后投票
   发表时间:2012-08-18  
所有的语言的底层都是c和汇编吧,即使是C++也是一样的
0 请登录后投票
   发表时间:2012-08-18  
我是不会告诉你们Groovy在项目中我是这么用的:

加载groovy:
@Log4j
@SuppressWarnings("unchecked")
public class GroovyWorkflowFactory implements WorkflowFactory {
	
	private GroovyScriptEngine engine = null;
	private Binding binding = new Binding();
	
	@Getter@Setter
	private WorkflowBeanService service = null;
	
	public GroovyWorkflowFactory(String scriptPath) {
		log.debug("initialize workflow factory with scripPath:" + scriptPath);
		binding.setProperty("language", "Groovy");
		
		log.debug("get root path of class loader...");
		URL path = this.getClass().getResource("/");
		log.debug(path.toString());
		
		log.debug("building script folder path ...");
		URL script = null;
		try {
			script = new URL(path.toString() + scriptPath);
			log.debug("script path: " + script.toString());
			
			URL[] root = new URL[]{script};
			
//			engine = new GroovyScriptEngine(root, 
//					ClassLoader.getSystemClassLoader());
			engine = new GroovyScriptEngine(root, 
					this.getClass().getClassLoader());
			log.debug("create GroovyScriptEngine success!");
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		
	}

//省略若干行
}


解析xml:
		root.elementIterator().each { item ->
			def id = item.attributeValue("guidID");						
			def parentId = item.attributeValue("guidParentID");
			parentId = Guid.isEmptyGuid(parentId) ? "" : parentId;
			
			def name = item.attributeValue("strName");
			
			ProjectPath path = new ProjectPath(id, parentId, name);			
			map.put(id, path);
		}



用Groovy 配置简单流程:
workflow = [
	name: 'IpDownloadTask',
	start: 'saved',
	saved: [
		isStart: true,
		audit: [
			perms: {flow, subject, inputs->
				return true;
			},
			execute: {flow, subject, inputs ->
				def nextStatus = inputs['nextStatus'];
				flow.status = (nextStatus == null) ? "audited1" : nextStatus;
				
				if(flow.status == 'audited3') {
					inputs['model'].bcheckstatus = 3;
				}
			}
		],
		rollback: rollback_map
	],
	audited1: [
		audit: [
			perms: {flow, subject, inputs->
				return true;
			},
			execute: {flow, subject, inputs ->
				def nextStatus = inputs['nextStatus'];
				flow.status = (nextStatus == null) ? "audited2" : nextStatus;
				
				if(flow.status == 'audited3') {
					inputs['model'].bcheckstatus = 3;
				}
			}
		],
		rollback: rollback_map
	],
	audited2: [
		audit: [
			perms: {flow, subject, inputs->
				return true;
			},
			execute: {flow, subject, inputs ->
				//这里必须做标识. 迁移客户端会监视这个字段
				//当bcheckstatus=3时,则执行迁移动作
				inputs['model'].bcheckstatus = 3;
				flow.status = "audited3";
			}
		],
		rollback: rollback_map
	],
	audited3: [
		isEnd: true
	],
	returned: [
		isEnd: true
	]
];

return workflow;

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics