锁定老帖子 主题:学习Groovy,紧紧把握一点就可以了
精华帖 (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的童鞋,继续去多实践吧!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-15
想起了那句,给你糖,甜到你忧伤,哈哈
动态语言的优越性不说,groovy写代码时候真是很爽的 我们项目中目前只是一次性操作与打杂的事情交给groovy了 |
|
返回顶楼 | |
发表时间:2012-08-16
groovy on grails 忧伤的飘过..
|
|
返回顶楼 | |
发表时间:2012-08-16
take 写道 groovy on grails 忧伤的飘过..
用自己喜欢的就好——我个人认为grails有点重——学习ROR COC等思想当然很好,其实只是简单用好groovy的一些基本功能和api就可以使得开发变得很简单和快速,尤其针对一钟应用做些良好的实践方式和工具,groovy的灵活性和优势就体现的很明显。 编程是种技能,语言是个工具,什么样的工具是其次,重要的是使用工具的人对工具的熟悉程度,深入了解以充分发挥其价值——希望熟悉和学习groovy的朋友一起多交流,多做分享,一起学习进步。 |
|
返回顶楼 | |
发表时间:2012-08-17
大家可能读到Groovy和Java相互操作、调用的一些文章和demo——其实哪有所谓的相互,完全都是vm的class之间的调用么——这句话要避嫌——底层都是C和汇编呢
为什么java编译成可执行文件后依然需要jre,难道类库不是一起编译的吗? |
|
返回顶楼 | |
发表时间:2012-08-17
最后修改:2012-08-17
somefuture 写道 大家可能读到Groovy和Java相互操作、调用的一些文章和demo——其实哪有所谓的相互,完全都是vm的class之间的调用么——这句话要避嫌——底层都是C和汇编呢
为什么java编译成可执行文件后依然需要jre,难道类库不是一起编译的吗? 你这扯的是另外的东东——我讲的是jvm上的动态语言(groovy)和java class交互的本质是GroovyClassloader先将.groovy编译成.class然后再和其他class进行交互的,不管所谓的有没有main,外包装的语法糖多么简洁等。 |
|
返回顶楼 | |
发表时间:2012-08-18
所有的语言的底层都是c和汇编吧,即使是C++也是一样的
|
|
返回顶楼 | |
发表时间: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; |
|
返回顶楼 | |
浏览 6126 次