Clojure provides very clear and simple syntax for Java interoperatility, using the folowing functions
import- add functions from the Java library into the current namespace
new- create a new Java object
.- is the short form of the
newfunction As Clojure is hosted on the Java Virtual Machine (JVM), its very easy to include libraries from any other languages that runs on the JVM, for example Java, Groovy, Scala, Jython, JRuby, Jaskell, etc.
The Leiningen build tool provides a simple way to include libraries as dependencies, using the
:dependenciessection of the
project.cljfile. Any library published to Maven Central is available for download by Leiningen, as both Maven Central and Clojars.org repositories are used by default.
Clojure projects and REPL environments include the
java.langlibrary automatically. Any methods from that library can be used without having to
importthem or include any dependencies
Its very easy to call Java methods and objects from clojure using the following syntax
(.instanceMember instance args*) (.instanceMember Classname args*) (.-instanceField instance) (Classname/staticMethod args*) Classname/staticField
Use the instanceMember .toUpperCase to convert a string from lower case to upper case
Use the staticField
Math/PIto return the approximate value of Pi
You can treat any static field like any name defined in your Clojure code, so when evaluated the static field simply returns the value it represents
In this case the
Math/PI staic field simply returns the approximate value of Pi that fits into a java.lang.Double type.
Math/PI -> 3.141592653589793
Getting the Java environment
Eariler we used Clojure functions to find information about our environment. We can also used the
getProperty() method from the
java.lang.System object to ask for the java version and jvm name.
Get version of Java & the JVM, returning those values as a meaningful string. Then get the version of the Clojure project
System/getenvto return your system's environment variables as a map
You may notice that this is a map data structure that we return, so we can use use destructuring or the maps behaviour itself to pull out information.
A full list of properties can be seen in the getProperty() documentation
There are more examples of Java Interoperability in the next few sections.