Groovy 2.0 新特性之:模塊化的 Groovy 以及擴展
更加模塊化的 Groovy
關于 Groovy 2.0 新特性,最后我們要講到的便是模塊化。和 Java 一樣,Groovy 不只是一個編程語言,同時還提供一組不同的 API 用于不同用途,包括:模板、Swing UI 構建、Ant 腳本、JMX 集成、SQL 訪問和 Servlet 等到。Groovy 之前是將這些特性和 API 放在一個非常大的 jar 包中,但是很多時候我們并不需要使用到所有的功能,例如我們只想要 Servlet 和模板引擎用來編寫 Web 應用,而用 Swing 構建器來開發桌面應用。
Groovy 模塊
因此該版本中提出的模塊化其實就是將原來一個很大的 Groovy jar 包分成多個功能獨立的小的 jar 包文件,而核心的 Groovy jar 包只有原來的一半還不到的大小。Groovy 2.0 提供的模塊包括:
- Ant: 用于對 Ant 任務進行腳本化處理,主要用于管理任務
- BSF: 集成了 Apache Bean Scripting 框架
- Console: 包含 Groovy Swing 控制臺的模塊
- GroovyDoc: 用于生成 Groovy 和 Java 類的文檔
- Groovysh: Groovysh 命令行 shell
- JMX: 用于 JMX 的集成
- JSON: 生成和解析 JSON 數據
- JSR-223: 通過 JDK 6+ 的 javax.scripting 在 Java 應用中集成 Groovy
- Servlet: 用于編寫 Groovy 腳本 Servlet 和模板
- SQL: 查詢關系數據庫
- Swing: 構建 Swing UIs 應用
- Templates: 使用模板引擎
- Test: 測試支持,類似 GroovyTestCase
- TestNG: 可在 Groovy 中編寫 TestNG 測試
- XML: XML 處理包 </ul>
在 Groovy 2 下,你可挑選你感興趣的模塊包,而不是將所有 jar 文件放到類路徑中。當然 Groovy 2 同樣提供了打包所有模塊的 jar 包,同時 Groovy 2 還提供了在 JDK 7 下支持 "invoke dynamic" 所需的 jar 包。
擴展模塊
你可以為 Groovy 編寫自己的擴展模塊。在將 Groovy 切分成很多小模塊的同時,Groovy 2 也允許創建新模塊。擴展模塊可為其他類提供實例和靜態的方法。Groovy 使用這個機制對 JDK 進行修飾,例如為 String、File、流等類添加一些有用的新方法。例如為 URL 類增加 getText() 方法,你就可以調用這個方法來獲取 URL 對應的文本內容。必須注意的是你模塊中的擴展方法也同樣會被靜態類型檢查器所支持。下面讓我們來介紹如何為已有的類增加新的方法。
新增實例方法
為已有的類增加新方法,你首先必須創建一個助手類 (Helper) 包含了這些要添加的方法。在 Helper 類中所有的這些方法都必須是 public 和 static 修飾的。而且這些方法的第一個參數是所擴展類的實例,其他的參數則是即將傳遞給擴展方法的參數。
加入我們要給 String 類增加一個 greets() 方法,該方法將打印一個打招呼的信息給傳遞進來的人名,代碼如下:
assert "Guillaume".greets("Paul") == "Hi Paul, I'm Guillaume"
然后我們需要創建一個 Helper 類:
package com.acmeclass MyExtension { static String greets(String self, String name) { "Hi ${name}, I'm ${self}" } }</pre>
新增靜態方法
對于靜態擴展方法所用的機制和約定是一致的,假如我們要給 Random 類增加一個在兩個數值之間取隨機數的方法:
package com.acmeclass MyStaticExtension { static String between(Random selfType, int start, int end) { new Random().nextInt(end - start + 1) + start } }</pre>
使用的方法如下:
Random.between(3, 4)擴展模塊描述符
一旦你編寫好了 Helper 類(不管是 Groovy 還是 Java 都可以),你需要為你的模塊創建一個描述。你需要創建一個名為
org.codehaus.groovy.runtime.ExtensionModule
的文件,該文件放在模塊壓縮包的META-INF/services
目錄下,該文件的目的就是為了告訴 Groovy 運行環境關于你模塊的名稱和版本信息,同時包括使用逗號隔開的多個要擴展的 Helper 類,下面是上面測試模塊的描述配置:moduleName = MyExtension moduleVersion = 1.0 extensionClasses = com.acme.MyExtension staticExtensionClasses = com.acme.MyStaticExtension有了這個擴展模塊的描述,你就可以在代碼中使用擴展方法,無需導入任何類、包等內容,這些擴展模塊會自動的注冊到 Groovy 的運行環境。
抓取擴展
通過在代碼中使用 @Grab 注解,你可以獲取來自 Maven 資料庫的依賴信息。使用 @GrabResolver 注解可以為你的依賴指定位置。如果你通過這個機制來抓取模塊的依賴性,擴展的方法將會自動被安裝。但你的模塊名和版本必須和 artifact 中的保持一致。
英文原文,OSCHINA原創翻譯
<