2013-10-07 44 views
3

我需要使用记录不完整的Java库,如果有方法可以查看REPL中方法的签名(用于快速实验),它将对我有所帮助。考虑以下几点:REPL中的方法签名

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

有没有像show-method-signature已有一个棘手的方法?

回答

5

clojure.reflect库是你的朋友在这里。

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

可以按如下方式使用它:

=> (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