作者:江南白衣 

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-3JSR-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>