Belajar Groovy - Konsep Dasar & Arsitektur Bahasa
Episode 2 of 23

Belajar Groovy - Konsep Dasar & Arsitektur Bahasa

Episode ini membedah arsitektur Groovy: struktur program, model eksekusi di JVM, kompilasi menjadi bytecode, serta interoperabilitas dua arah dengan Java. Kalian juga akan menjalankan Groovy dari dalam aplikasi Java menggunakan GroovyShell.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Setelah memahami sejarah dan posisi Groovy di ekosistem JVM, sekarang saatnya membedah arsitektur bahasa — bagaimana Groovy bekerja di balik layar. Pemahaman ini penting karena menjelaskan mengapa Groovy bisa dinamis dan sekaligus kompatibel dengan Java.

Episode 2 membahas struktur program Groovy, model eksekusinya di JVM, proses kompilasi bytecode, dan interoperabilitas dua arah antara Groovy dan Java. Di akhir episode kalian akan bisa menjalankan kode Groovy dari dalam aplikasi Java dan sebaliknya.

Struktur Program Groovy

Script sebagai Unit Eksekusi

Struktur program Groovy bergantung pada cara kalian menjalankannya. Ada tiga bentuk utama:

  • Script: file .groovy tanpa deklarasi class, dieksekusi langsung dari atas ke bawah.
  • Class: file .groovy berisi deklarasi class Groovy, mirip file Java.
  • Mixin: kombinasi keduanya, di mana satu file berisi class dan juga statement bebas di luar class.

Saat Groovy menjalankan sebuah script, ia secara otomatis membungkusnya ke dalam class bernama Script, dan setiap statement menjadi isi method run. Variabel yang dideklarasikan di level script menjadi property dari class tersebut.

Variabel Binding dan Run

Model ini membuat hal menarik: variabel yang didefinisikan di satu bagian script tetap bisa diakses di bagian lain, karena semuanya berada dalam satu scope run. Berikut contoh struktur script sederhana:

Struktur script Groovy
def nama = "Arman"
def umur = 25
 
def perkenalan() {
    return "Nama: ${nama}, Umur: ${umur}"
}
 
println perkenalan()

Script di atas mendefinisikan dua variabel dan satu method, lalu memanggilnya. return "Nama: ${nama}, Umur: ${umur}" memanfaatkan GString untuk interpolasi nilai variabel — topik yang akan kita dalami di episode 3.

Model Eksekusi di JVM

Kompilasi Menjadi Bytecode

Groovy memiliki dua jalur eksekusi utama. Pertama, Groovy mengkompilasi kode menjadi bytecode dengan groovyc, menghasilkan file .class yang bisa dijalankan oleh JVM seperti class Java biasa. Kedua, script bisa dijalankan langsung dengan perintah groovy, yang melakukan kompilasi secara otomatis di balik layar.

Kompilasi script menjadi class
groovyc halo.groovy
ls *.class

Perintah groovyc halo.groovy menghasilkan satu atau lebih file .class di direktori yang sama. File tersebut bisa dijalankan dengan java jika class utama ditemukan, atau digabungkan ke project Java yang lebih besar.

Dynamic Dispatch

Berbeda dari Java, kompilasi Groovy mempertahankan dynamic dispatch. Saat sebuah method dipanggil, Groovy mencari implementasi yang sesuai saat runtime, bukan saat kompilasi. Inilah yang memungkinkan metaprogramming — behavior method bisa diubah atau ditambah setelah kompilasi.

Akibatnya, bytecode Groovy lebih besar dan sedikit lebih lambat dibandingkan bytecode Java murni. Episode 16 akan membahas trade-off ini secara mendalam, termasuk cara menutupnya dengan @CompileStatic.

Groovy sebagai Scripting Language

Execution Engine dan GroovyShell

Untuk kebutuhan scripting di dalam aplikasi, Groovy menyediakan GroovyShell. Ini adalah API utama untuk mengevaluasi ekspresi atau script Groovy dari dalam kode Java. Berikut contohnya:

Evaluasi script dengan GroovyShell
def shell = new GroovyShell()
def hasil = shell.evaluate("1 + 2 * 3")
println hasil

shell.evaluate("1 + 2 * 3") mengeksekusi string Groovy dan mengembalikan hasilnya, yaitu 7. new GroovyShell() membuat instance engine evaluasi yang bisa dipakai berulang kali dengan binding variabel yang sama.

GroovyConsole dan Groovysh

Untuk eksplorasi interaktif, Groovy menyediakan dua tool: groovyConsole yang berbasis GUI, dan groovysh yang berbasis terminal. Keduanya memanfaatkan engine yang sama dengan GroovyShell, sehingga hasil yang kalian lihat di REPL akan konsisten dengan perilaku di production.

Interoperabilitas dengan Java

Memanggil Library Java dari Groovy

Karena berjalan di JVM, Groovy bisa memakai library Java apa pun tanpa adapter. Import package Java bekerja secara langsung, termasuk access ke enum, static method, dan generic types.

Menggunakan library Java dari Groovy
import java.time.LocalDate
 
def hariIni = LocalDate.now()
println "Tanggal hari ini: ${hariIni}"

import java.time.LocalDate memperlihatkan bahwa sintaks import Groovy identik dengan Java. LocalDate.now() dipanggil langsung, dan hasilnya bisa diinterpolasi ke GString tanpa boilerplate.

Menjalankan Groovy dari Aplikasi Java

Interoperabilitas juga berjalan arah sebaliknya. Groovy jar memakai GroovyObject dan kompatibel dengan mekanisme reflection Java, sehingga aplikasi Java bisa memakai class Groovy secara langsung. Untuk evaluasi script dinamis, Java memakai GroovyShell:

GroovyShell dari kode Java
import groovy.lang.GroovyShell;
 
public class Main {
    public static void main(String[] args) {
        GroovyShell shell = new GroovyShell();
        Object hasil = shell.evaluate("2 + 2");
        System.out.println(hasil);
    }
}

Untuk menjalankan kode Java di atas, pastikan groovy-4.0.24.jar ada di classpath. shell.evaluate("2 + 2") di dalam kode Java memanggil engine Groovy yang sama, membuktikan bahwa Groovy dan Java hidup dalam satu proses JVM tanpa batasan.

Pilihan: Groovy Console vs Embedded

Ada dua pola pemakaian Groovy di aplikasi Java:

  • Compile-time: class Groovy dikompilasi bersama project Java, hasilnya type-safe dan cepat.
  • Runtime: script dievaluasi dengan GroovyShell atau GroovyClassLoader, fleksibel tetapi lebih lambat dan perlu perhatian keamanan.

Pola runtime akan kita bedah lagi di episode 20, terutama aspek sandboxing untuk script yang berasal dari sumber tidak terpercaya.

Penutup

Episode 2 menjelaskan cara kerja internal Groovy: script dibungkus ke class Script, dikompilasi menjadi bytecode JVM, mempertahankan dynamic dispatch saat runtime, dan berinteraksi dua arah dengan Java melalui GroovyShell.

Inti yang harus dibawa pulang:

  • Script Groovy otomatis dibungkus ke class Script oleh engine.
  • groovyc menghasilkan bytecode .class yang bisa dipakai Java.
  • Groovy memakai dynamic dispatch, sehingga perilaku method bisa diubah saat runtime.
  • GroovyShell adalah API utama untuk mengevaluasi script dari aplikasi Java.
  • Import dan pemanggilan library Java berjalan mulus tanpa adapter.
  • Pilih pola compile-time untuk performa, pola runtime untuk fleksibilitas.

Di episode 3 selanjutnya kita akan membahas sintaks dasar dan tipe data — variabel dinamis dengan def, tipe primitif, string, list, map, GString, multi-line string, dan operator string. Ini adalah kosakata dasar yang akan dipakai di semua episode berikutnya.