4

文書化が不十分な Java ライブラリを使用する必要があり、REPL でメソッドの署名を確認する方法があれば役立ちます (簡単な実験用)。次の点を考慮してください。

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

show-method-signatureすでに利用可能なようなトリッキーな方法はありますか?

4

1 に答える 1

6

ここでは、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
于 2013-10-07T10:41:02.647 に答える