Comment puis-je obtenir les méthodes d’une classe Java de Clojure?

Comment puis-je obtenir les méthodes d’une classe Java de Clojure?

[EDIT 2]

Selon le commentaire de M Smith ci-dessous, cela accomplit la même chose mais fournit un sorting par nom de méthode et ne retourne que des méthodes:

(print-table (sort-by :name (filter :exception-types (:members (r/reflect "foo"))))) 

[/ EDIT 2]

[MODIFIER]

Ma réponse originale se réfère à Clojure 1.2, mais les choses ont changé avec Clojure 1.3. Cela fonctionne sans aucune dépendance sur les bibliothèques consortingb de Clojure maintenant:

 (require '[clojure.reflect :as r]) (use '[clojure.pprint :only [print-table]]) (print-table (:members (r/reflect "foo"))) 

Ceci fournit une approche beaucoup plus découplée, avec la fonction de reflect fournissant toutes sortes d’informations sur l’argument passé (dans ce cas, un Ssortingng "foo" ) et la fonction print-table prenant n’importe quelle structure de données tabulaire générique tel.

Ceci est à l’origine de ce thread sur le groupe Google .

[/MODIFIER]

J’utiliserais la fonction show dans l’espace de noms clojure.consortingb.repl-utils , qui imprimera tous les membres statiques et d’instance d’un object (ou d’une classe d’object). Je l’exige comme ça:

 (require '[clojure.consortingb.repl-utils :as ru]) 

Voici un exemple d’utilisation de Joda Time:

 (import 'org.joda.time.DateTime) (ru/show DateTime) (ru/show (DateTime.)) 

Le premier exemple montre comment vous pouvez simplement passer une classe à show , tandis que le second montre que vous pouvez également passer une instance de la classe.

Cela fonctionne bien sûr pour de nombreux éléments Clojure qui sont des classes Java en dessous. Voici un exemple de voir toutes les méthodes disponibles pour une instance de java.lang.Ssortingng:

 (ru/show "foo") 

Essayez clojure.reflect , disponible dans les versions récentes de Clojure 1.3.0-alpha *. Il renvoie les structures de données Clojure que vous pouvez rechercher / filtrer selon vos besoins.

 Clojure 1.3.0-alpha6 user=> (use 'clojure.reflect 'clojure.pprint) nil user=> (pprint (reflect "hello")) {:bases #{java.io.Serializable java.lang.Comparable java.lang.Object java.lang.CharSequence}, :flags #{:public :final}, :members #{{:name valueOf, :return-type java.lang.Ssortingng, :declaring-class java.lang.Ssortingng, :parameter-types [boolean], :exception-types [], :flags #{:static :public}} ... 

Vous pouvez utiliser cette méthode qui utilise clojure.reflect et étend les réponses précédentes:

 (use 'clojure.reflect) (defn all-methods [x] (->> x reflect :members (filter :return-type) (map :name) sort (map #(str "." %) ) distinct println)) 

Usage:

  (all-methods "") ; => (.charAt .checkBounds .codePointAt .codePointBefore .codePointCount .compareTo .compareToIgnoreCase .concat .contains .contentEquals .copyValueOf .endsWith .equals .equalsIgnoreCase .format .getBytes .getChars .hashCode .indexOf .intern .isEmpty .lastIndexOf .length .matches .offsetByCodePoints .regionMatches .replace .replaceAll .replaceFirst .split .startsWith .subSequence .subssortingng .toCharArray .toLowerCase .toSsortingng .toUpperCase .sortingm .valueOf) (all-methods 1) ; => (.bitCount .byteValue .compareTo .decode .doubleValue .equals .floatValue .getChars .getLong .hashCode .highestOneBit .intValue .longValue .lowestOneBit .numberOfLeadingZeros .numberOfTrailingZeros .parseLong .reverse .reverseBytes .rotateLeft .rotateRight .shortValue .signum .ssortingngSize .toBinarySsortingng .toHexSsortingng .toOctalSsortingng .toSsortingng .toUnsignedSsortingng .valueOf) (all-methods java.util.SsortingngTokenizer) ; => (.countTokens .hasMoreElements .hasMoreTokens .isDelimiter .nextElement .nextToken .scanToken .setMaxDelimCodePoint .skipDelimiters) 

Ce code affichera toutes les méthodes publiques déclarées et héritées.

 (doseq [m (.getMethods (type "Hello"))] (println "Method Name: " (.getName m)) (println "Return Type: " (.getReturnType m) "\n")) 

ceci retournera le tableau Java des méthodes déclarées:

 (:declaredMethods (bean Ssortingng)) (seq (:declaredMethods (bean Ssortingng))) 

l’avantage est que haricot est dans clojure.core

Essayez ma nouvelle bibliothèque:

http://github.com/zcaudate/iroh

 (.? Ssortingng #"^c" :name) ;;=> ["charAt" "checkBounds" "codePointAt" "codePointBefore" ;; "codePointCount" "compareTo" "compareToIgnoreCase". ;; "concat" "contains" "contentEquals" "copyValueOf"]