Skip to content

Instantly share code, notes, and snippets.

@tbatchelli
Created October 19, 2010 22:46
Show Gist options
  • Save tbatchelli/635307 to your computer and use it in GitHub Desktop.
Save tbatchelli/635307 to your computer and use it in GitHub Desktop.
;;;; reflection
(defn method-call-fn [method-name return-type parameter-types]
(let [o-symbol (symbol "o")
method-symbol (symbol (eval method-name))
args (map #(with-meta (symbol (str "x" %2)) {:tag %1}) parameter-types (range))]
(eval `(fn [~o-symbol ~@args] (. ~o-symbol ~method-symbol ~@args )))))
(defn get-signature [^java.lang.reflect.Method method]
(let [method-name (.getName method)
return-type (.getReturnType method)
parameter-types (vec (.getParameterTypes method))]
{:method-name method-name
:return-type return-type
:parameter-types parameter-types}))
(comment
(def eval-method-call (method-call-fn "equals" boolean [java.lang.Object]))
(eval-method-call "hello" "hello")
;; true
(eval-method-call "hello" "goodbye")
;; false
)
@hugoduncan
Copy link

(defn method-call-fn [method-name return-type parameter-types]
    (let [method-symbol (read-string method-name)
           args (map #(with-meta (symbol (gensym "x")) {:tag %}) parameter-types)]
    (eval `(fn [~'o ~@args] (. ~'o ~method-symbol ~@args )))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment