7
votes

Comment tirer les constantes de finale statique d'une classe Java dans un espace de noms de clojure?

J'essaie d'envelopper une bibliothèque Java avec une liaison de clojure. Une classe particulière de la bibliothèque Java définit un groupe de constantes finales statiques, par exemple:

(def foo-bar Foo/BAR)
(def foo-some-constant Foo/SOME_CONSTANT)


0 commentaires

3 Réponses :


2
votes

(cette réponse comprend maintenant deux solutions de travail, une fois sur mon idée initiale avec stagiaire code> et une base sur la suggestion de Danlei à utiliser CCImpport-static code>. Je suppose que je devrai nettoyer cela un peu plus tard, mais je ne peux pas passer plus de temps dessus maintenant ...) em>

extraire des champs statiques: p> xxx

puis map # (stagiaire * ns * (str "a-préfixe-" (.getname%)) (.tClass nil)) code> sur cette séquence pour obtenir la valeur ... Notez que Ce bit n'est pas testé fort> et, en particulier, je ne suis pas sûr de ce nil code> dans .get code>; Expérimentez avec java.lang.field code> et voyez ce qui fonctionne avec votre classe. Strike> p>

Mise à jour 2: strong> P> P>

OK, en fait, une approche basée sur stagiaire code> n'est pas si mauvaise lisibilité-wise: p> xxx pré>

update: strong> ( Laissant la première mise à jour en place sous forme de solution alternative) em> p>

Combinant la connaissance de Danlei de Clojure.Contribe Code> avec les rendements ci-dessus: P>

user> (map #(eval `(import-static java.lang.Integer ~(symbol (.getName %))))
           (filter #(bit-and java.lang.reflect.Modifier/STATIC
                             (.getModifiers %))
                   (.getFields java.lang.Integer)))
(#'user/MIN_VALUE #'user/MAX_VALUE #'user/TYPE #'user/SIZE)
user> MIN_VALUE
-2147483648
user> MAX_VALUE
2147483647
user> TYPE
int
user> SIZE
32


0 commentaires

1
votes

Je n'ai pas essayé, mais peut-être clojure.contrib.import-statique peut le faire.

Il suffit de vérifier: vous devrez nommer les méthodes / champs lorsque vous utilisez importé-statique, mais je laisserai cette réponse ici car il peut être utile pour les personnes à la recherche de réponses connexes.


1 commentaires

C.C.IMPORT-STATIC , D'OH ... En réalité, il est parfaitement possible de le profiter ici avec l'aide de eval . J'ai pris la liberté de l'utiliser dans une modification à ma réponse qui donne une approche alternative de stagiaire + scandery de réflexion Java.



3
votes

Malheureusement, la macro clojure.contrib.import-static ne permet pas d'importer tous les champs finaux statiques . Vous devez fournir une liste de champs à importer.

Cette macro est une enveloppe idiomatique pour importateur-statique : xxx


1 commentaires

Y a-t-il peut-être une solution de clojure plus concise qui utilise clojure.reflect / reflect ? clojuredocs.org/clojure_core/clojure.reflect/reflect