In My Clojure-code I'd like to generate a class-file that contains a static method (named staticMethod
), which is later on called by in a static context from a Java-program.
I tried (Clojure):
(ns com.stackoverflow.clojure.testGenClass
(:gen-class
:name com.stackoverflow.clojure.TestGenClass
:prefix "java-"
:methods [
[#^{:static true} staticMethod [String String] String]
]))
(def ^:private pre "START: ")
(defn #^{:static true} java-staticMethod [this text post]
(str pre text post))
and (Java):
package com.stackoverflow.clojure;
public class TestGenClassTest {
private TestGenClassTest() {
}
public static void main(String[] args) {
TestGenClass.staticMethod("Static call from Java!", " :END");
}
}
On https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html I read:
By adding metadata – via #^{:static true} – to a method declaration you can also define static methods.
No matter where I put the #^{:static true}
the Java compiler always says:
Cannot make a static reference to the non-static method staticMethod(String, String) from the type TestGenClass
How can I define static methods in Clojure? Would #^{:static true}
and ^:static
mean the same? Where is this documented?
:methods
-part of:gen-class
and Second in the definition of the function (defn
). – Damoiselle:methods [^:static [staticMethod [String String] String] ]
– Peppy#^{:static true}
, once only in the:methods
, once only in thedefn
and (as shown above) in both. It seems that I don't understand how Metadata work. I e.g. tried(def ^:static test "Test")
and then(meta test)
Shouldn't this give me "static" instead of "nil"? – Damoiselle(def m ^:static [1 2 3 4])
works, while(def ^:static m [1 2 3 4])
does not work. – Damoiselle(meta m)
, you enquire the metadata of the object referenced bym
, not the symbolm
. This follows from the fact that justm
evaluates to the collection, not the symbol. – Peppy