加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy 笔记

发布时间:2020-12-14 17:02:09 所属栏目:大数据 来源:网络整理
导读:作者: 江南白衣 ? 1.Groovy的最新八卦之处 1.1 Wiki: http://docs.codehaus.org/pages/listpages.action?key=GROOVY 1.2 Mail list的在线浏览和rss定阅? ?????? Developer List http://dir.gmane.org/gmane.comp.lang.groovy.devel ?????? User List: http

作者:江南白衣?

1.Groovy的最新八卦之处

1.1 Wiki: http://docs.codehaus.org/pages/listpages.action?key=GROOVY
1.2 Mail list的在线浏览和rss定阅?
?????? Developer List http://dir.gmane.org/gmane.comp.lang.groovy.devel
?????? User List: http://dir.gmane.org/gmane.comp.lang.groovy.user

2.Groovy的开发现状和未来
??? 编译期健壮性大大增强的1.0 JSR-2,全力除Bug的1.0 JSR-3,JSR-4已经发布。
??? 第二次全球Groovy 开发人员FB大会也在巴黎开完,有决议若干。
??? 理论上 1.0正式版很快就要发布。?
??? 而计划中的1.1版本将支持 ruby的maxin、continuations 和JDK1.5的Annotatin。

3.Groovy and Java的暧昧关系
?? 作为Java的私生子,Groovy的最终可执行状态是Java?class bytecode,所以Java代码里可以把它当普通Java Bean一样调用。还有,Groovy的基础类库,都是用Java代码来写的。

???3.1?编译Java?class bytecode
???就像JSP的最终面目是servlet class,GroovyC也会把groovy文件编译成Java class bytecode以在JVM上运行。
???其中Groovy Class会编译成GroovyObject的子类,Groovy Script代码段会编译成Script的子类。
?????
????可以用GroovyC来静态编译,也可以在Java程序里用GroovyShell动态parse Groovy文件。

????3.2 在Java代码中调用Groovy
???????? 1.Groovy类:
?????????GroovyObject类默认有get/setProperty()和invokeMethod()的反射接口,在Java代码里,可以直接调用Groovy类的方法,也可以通过反射接口来调用。

???????? 2.Script代码段:
???????? Script类有Script(Binding)构造函数和run()接口,在java里先通过Script(Binding)构造一个Script类,绑定变量,然后通过run接口进行调用。

??? 3.3 在Java中直接使用Groovy的类库
??? Groovy和Groovy的框架类库都是用Java写出来的的。所以有些类库如SimpleTemplateEngine,也可以在Java里直接使用,不用绕Groovy一圈。

4.groovyJ插件
??? groovyJ是IDEA插件,有语法变色和Run()功能,更有用的功能是编译Java文件目录时,会把其中的groovy文件也一同编译。而日后将支持重构、类间跳转等功能,值得期待。
????而Eclipse插件只有Run()和语法变色,而且随着Eclipse的升级时灵时不灵,正在花时间实用化中。
??? NetBeans开了个Coyote的项目来支持脚本语言。

5.一些重要的开发人员?
??? 一个PM:
??? Guillaume Laforge

??? 两个Founder:
????Bob Mcwhirter (同时是Drools,Dom4J的founder
)?,
????James Strachan (Core Developers Network,同时work on Geronimo,Drools,ServiceMix 和很多Jarkarta 项目,似乎拥有无穷的精力)????

??? 三个来自ThoughtWorks的开发人员:
?????Jame Walnes,Chris Stevenson,Matt Foemmel

??? 四个star of? JSR-2:?
?????Jeremy Rayner,Jochen Theodorou,和两位老大一起改进JSR-2编译的强壮性和出错信息显示?
?????Franck Rasolo:IDEA插件GroovyJ的开发人员?
?????Christian Stein :Groovlet,Template的开发人员?

?????Steven Devijver?: Grails--Groovy on Rails的主持,同时是Spring Modules的leader。

6.有哪些使用Groovy的项目

Grails(Groovy on rails,大老们非常期待的项目,把rails在MVC和ORM的优点抄到java下,而且是基于Spring Framework的)

Drools(规则引擎,用户可以用groovy写规则)

eXo platform(porlet/Service container,本身核心是groovy,用户可以用groovy 来写Porlet)

XWiki (第2代的wiki引擎、Application引擎。用户可以用groovy写Plug-in,Marco和Application)

RIFE(一个MVC/Web framework,用户可以用groovy写action和配置layout,workflow。还含有一个CRUD框架,用户用groovy 定义domain class,滴嗒一下,就能获得一个CRUD模型)

7.Groovy-all-1.0-jsr3.jar?
??? groovy需要asm和antlr包的支持,使用groovy-all-10-jsr3.jar,将预带这两个包的正确版本,非常省心。

8.Migrating to JSR

??? JSR版本语法的的最大改动有两处。网上很多Groovy文章都还是基于旧语法的,需要自己改正过来。
??? 8.1 为了加强代码健壮性,Class里的变量需要用def 定义。而在script里的变量因为是动态binding的,仍然不需要def定义。

??? 8.2 多行的String需要用 """ """而不是" "来括住。

9.SimpleTemplateEngine-总共200行就实现了JSP engine的功能
??? 动态语言开发框架很方便,所以Ruby on Rails没有IDEA级的IDE都能这么就把MVC、ORM都实现了一遍。
??? 请看src/groovy/text/SimpleTemplateEngine.java,总共219行。
????原理就是把模版中的文本部分替换成println """ 文本""" ,Groovy部分照搬,生成一个新的Groovy script,然后拿GroovyShell执行一遍就完成了。

10.如何用Java实现动态语言

 把GroovyC编译出来的class文件再用jad反编译,可以看到如何用Java去实现一门动态语言。
??? 主要是多了一个MetaClass, 不断的反射反射,运行时还非常依赖Asm


 最简单的例子:
?? Groovy文件:

? public ? class ?Customer
?{
????
private ?String?id;
?}?

?? 编译出来的Java文件

??? public ? class ?Customer????implements?GroovyObject?
??{
  ?
private ?String?id;
  ?transient?MetaClass?metaClass;?
  ?
public ?Customer()
??????? {
??? ????????Object?obj?
= ?ScriptBytecodeAdapter.invokeStaticMethod??( " org.codehaus.groovy.runtime.ScriptBytecodeAdapter " ,? " getMetaClass " ,? this );
????????????Metaclass ?metaclass?
= ?(MetaClass)ScriptBytecodeAdapter.asType(obj,?groovy.lang.MetaClass. class );?
????????}?
???????
public ?Object?invokeMethod(String?s,?Object?obj)????{

}?
??? ???
public ?Object?getProperty(String?s)????{

.}

11.ant 的编译脚本
??? < path? id ="groovy.classpath" > ?
???????
< pathelement? path ="${basedir}/ROOT/WEB-INF/classes/" /> ??
??????
< fileset? dir ="${basedir}/ROOT/WEB-INF/lib" >
???????????? < include? name ="*.jar" />
???????? </ fileset >
???? </ path >
???? < taskdef? name ="groovyc" ?classname ="org.codehaus.groovy.ant.Groovyc" >
???????? < classpath? refid ="groovy.classpath" />
???? </ taskdef >
???? < target? name ="groovy" >
???????? < groovyc? destdir ="${project.basedir}/ROOT/WEB-INF/classes"
?????????srcdir ="${project.basedir}/src" ????listfiles ="true" > ?
???????????
< classpath? refid ="groovy.classpath" />
???????? </ groovyc >
???? </ target >

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读