2014-10-17 8 views
5

In My Clojure-code mi piacerebbe generare un file di classe che contenga un metodo statico (chiamato staticMethod), che viene in seguito chiamato da un contesto statico da un programma Java.Come generare i metodi statici con la classe Gen di clojure?

ho cercato (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)) 

e (Java):

package com.stackoverflow.clojure; 

public class TestGenClassTest { 

    private TestGenClassTest() { 
    } 

    public static void main(String[] args) { 
     TestGenClass.staticMethod("Static call from Java!", " :END"); 
    } 
} 

Su https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html ho letto:

Con l'aggiunta di metadati - via #^{: static true} - a una dichiarazione di metodo è anche possibile definire metodi statici.

Non importa dove ho messo il #^{:static true} il compilatore Java dice sempre:

Non può fare un riferimento statico per il non-metodo statico staticMethod (String, String) dal tipo TestGenClass

Come definire i metodi statici in Clojure? #^{:static true} e ^:static significano lo stesso? Dove è documentato?

+1

Dove esattamente hai provato a inserire i metadati? Rispondere alla tua ultima domanda è semplice: http://clojure.org/metadata –

+0

Prima nella parte ': methods' di': gen-class' e Second nella definizione della funzione ('defn'). – Edward

+1

OK --- se l'unico modo in cui l'hai provato è il modo in cui la tua domanda attuale afferma, quindi prova quanto segue: ': metodi [^: static [staticMethod [String String] String]]' –

risposta

9

Quando Kotka detto di annotare il metodo dichiarazione, egli "obviosly" significava l'intero vettore tenendo la dichiarazione:

:methods [^:static [staticMethod [String String] String] ] 

Questo tipo di formulazione laconica è purtroppo tipico della documentazione Clojure.