Groovy 編譯產物為標準 Java Class Bytecode,故可在 Java 代碼中像普通 Bean 一樣調用;Groovy 基礎類庫亦由 Java 實現。
groovyc 靜態編譯 .groovy → .classGroovyObject 子類;Script 片段編譯為 Script 子類GroovyShell 動態解析執行| 類型 | 調用方式 |
|---|---|
| Groovy 類 | 直接呼叫方法,或透過 get/setProperty()、invokeMethod() 反射介面 |
| Script 片段 | 用 Script(Binding) 建構綁定變量,再呼叫 run() |
如 SimpleTemplateEngine 等純 Java 實現的 Groovy 框架類庫,可在 Java 專案直接引用,無需繞經 Groovy 執行期。
| 專案 | 定位 | Groovy 角色 |
|---|---|---|
| Grails | Groovy on Rails,基於 Spring MVC + ORM | 核心開發語言 |
| Drools | 規則引擎 | 用戶以 Groovy 撰寫規則 |
| eXo Platform | Portlet/Service 容器 | 核心即 Groovy,用戶寫 Portlet |
| XWiki | 二代 Wiki/應用引擎 | Plugin、Macro、Application 用 Groovy 開發 |
| RIFE | MVC/Web 框架 | Action、Layout、Workflow、CRUD 領域類定義 |
使用 groovy-all-1.0-JSR3.jar 內建正確版本 ASM 與 ANTLR,零配置煩惱。
def 宣告(強化健壯性);Script 變數因動態綁定仍可省略。""" """ 包裹,取代雙引號。原理:模板靜態文本 → println \"\"\" 文本 \"\"\",Groovy 片段保留,生成新 Script 交由 GroovyShell 執行。動態語言特性讓框架開發極度精簡。
groovyc 編譯 → jad 反編譯,可見核心在於 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(...);
this.metaClass = (MetaClass) ScriptBytecodeAdapter.asType(obj, MetaClass.class);
}
public Object invokeMethod(String name, Object args) { ... }
public Object getProperty(String name) { ... }
}
<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>
Groovy 以「Java 語法、動態靈魂、無縫互操作」獨特定位,成為 JVM 生態圈不可忽視的動態語言選擇。掌握其編譯模型、MetaClass 機制與 Java 整合模式,能為專案引入腳本化彈性、DSL 構建能力與開發效率提升。