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.

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 bergantung pada cara kalian menjalankannya. Ada tiga bentuk utama:
.groovy tanpa deklarasi class, dieksekusi langsung dari atas ke bawah..groovy berisi deklarasi class Groovy, mirip file Java.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.
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:
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.
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.
groovyc halo.groovy
ls *.classPerintah 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.
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.
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:
def shell = new GroovyShell()
def hasil = shell.evaluate("1 + 2 * 3")
println hasilshell.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.
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.
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.
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.
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:
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.
Ada dua pola pemakaian Groovy di aplikasi Java:
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.
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 oleh engine.groovyc menghasilkan bytecode .class yang bisa dipakai Java.GroovyShell adalah API utama untuk mengevaluasi script dari aplikasi Java.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.