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
…