2014-10-17 7 views
5

In meinem Clojure-Code möchte ich eine class-Datei generieren, die eine statische Methode (mit dem Namen staticMethod) enthält, die später in einem statischen Kontext von einem Java-Programm aufgerufen wird.Wie generiere ich statische Methoden mit Clojures Gen-Klasse?

habe ich versucht (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)) 

und (Java):

package com.stackoverflow.clojure; 

public class TestGenClassTest { 

    private TestGenClassTest() { 
    } 

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

Auf https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html Ich las:

von Metadaten hinzufügen - über #^{: static true} - Zu einer Methodendeklaration können Sie auch statische Methoden definieren.

Egal, wo ich die #^{:static true} legte der Java-Compiler immer sagt:

Es kann keine statische Verweis auf die nicht-statische Methode Static (String, String) vom Typ machen TestGenClass

Wie kann ich statische Methoden in Clojure definieren? Würden #^{:static true} und ^:static dasselbe bedeuten? Wo ist das dokumentiert?

+1

Wo genau haben Sie versucht, die Metadaten zu setzen? BTW Antwort auf Ihre letzte Frage ist einfach: http://clojure.org/metadata –

+0

Zuerst im ': Methoden'-Teil von': gen-Klasse' und Zweite in der Definition der Funktion ('defn'). – Edward

+1

OK --- wenn die einzige Art, wie Sie es versucht haben, ist die Art, wie Ihre aktuelle Frage besagt, dann versuchen Sie Folgendes: ': Methoden [^: statisch [staticMethod [String] String]] –

Antwort

9

Wenn kotka sagte, die Methode zu annotieren Erklärung, er „obviosly“ bedeutete die gesamte Vektor die Erklärung hält:

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

Diese Art der lakonische Formulierung ist leider typisch für Clojure-Dokumentation.