2013-10-07 4 views
3

J'ai besoin d'utiliser une bibliothèque Java mal documentée et cela m'aiderait s'il y avait un moyen de voir la signature des méthodes dans REPL (pour des expériences rapides). Considérez ce qui suit:Signature de méthode dans REPL

user=> (import 'x.y.z.C) 
user=> (show-method-signature 'C/m) 
     C/m String Integer String boolean 

Y at-il une méthode délicate comme show-method-signature déjà disponible?

Répondre

5

La bibliothèque clojure.reflect est votre ami ici.

(require '[clojure [reflect :as r]]) 

;; Return the method signature for methods matching a given regex. 
;; Params: 
;; cls    - a class (eg. java.util.List) or an instance 
;; method-name-regex - a regex string to match against the method name 
(defn method-sig [cls method-name-regex] 
    (let [name-regex (re-pattern method-name-regex)] 
    (filter #(re-matches name-regex (str (:name %))) 
      (:members (r/reflect cls))))) 

Vous pouvez l'utiliser comme suit:

=> (method-sig java.util.List "add") 
;; returns 
({:name add, 
    :return-type boolean, 
    :declaring-class java.util.LinkedList, 
    :parameter-types [java.lang.Object], 
    :exception-types [], 
    :flags #{:public}} 
{:name add, 
    :return-type void, 
    :declaring-class java.util.LinkedList, 
    :parameter-types [int java.lang.Object], 
    :exception-types [], 
    :flags #{:public}}) 

=> (method-sig (java.util.LinkedList.) "add.*") ;; also works 
Questions connexes