Java Interop

gen-class generates named Java classes (for frameworks that require them, e.g. main classes or servlets). Calling Clojure from Java: clojure.java.api.Clojure/var.

;; Calling methods and constructors
(.toUpperCase "hello")                     ; "HELLO": instance method
(.length "hello")                          ; 5
(Math/sqrt 16)                             ; 4.0: static method
Math/PI                                    ; static field
(java.util.Date.)                          ; constructor (or (new java.util.Date))
(import '(java.time LocalDate Duration))
(LocalDate/of 2025 10 24)
(.plusDays (LocalDate/now) 7)
(.. (LocalDate/now) (plusDays 1) (getDayOfWeek))   ; chained calls

;; Fields and setters
(def p (java.awt.Point. 1 2))
(.-x p)                                    ; 1: field access
(set! (.-x p) 10)

;; Clojure 1.12: qualified methods as values and explicit instance/constructor syntax
(map String/.length ["a" "bb"])            ; (1 2)
(map java.io.File/new ["a.txt" "b.txt"])   ; constructors as functions
String/1                                   ; array class syntax: String[]

;; Java collections and arrays
(def al (java.util.ArrayList. [1 2 3]))
(seq al)                                   ; Clojure seq over a Java collection
(into [] al)
(int-array [1 2 3])                        ; primitive array
(aget (int-array [1 2 3]) 0) (alength
…