Since a macro's arguments must be available at compile time, creating one 
for calling a runtime defined method won't work.

Because of this we are left with *eval*, which actually compiles and then 
evaluates at runtime the expression it receives as an argument.

Here's a function that receives an object, a method name (as a symbol or 
string) and optional arguments; and then uses eval to find the result:


(ns calling-methods
  (:require [clojure.reflect :as r]))
;-----------------------------
(defn call-method* [obj m & args]
  (eval `(. ~obj ~(symbol m) ~@args)))
;-----------------------------  
(def method-def (->> (r/reflect "String")
                    :members
                    (filter #(= "toString" (str (:name %))))
                    first))
 
(let [x     {:a 1 :b 2}
      s     "hi"
      upper "toUpperCase"]
  (println (call-method* x (:name method-def)))
  (println (call-method* "hi" (:name method-def)))
  (println (call-method* "hi" upper)))


Hope it helps.

J

On Monday, February 11, 2013 5:34:00 PM UTC-3, Bauna wrote:
>
> Hey all, 
> I'm a newbie that is trying to use clojure for my university grade thesis. 
> In  our project we have to generate a graph structure invoking some 
> methods on a standard java class. This class is provided at run time, so 
> the methods that need to be called must be obtained by 
> reflection. I've been trying to use clojure.reflect, but I was not able to 
> find a way to invoke a method on the class with the symbols retrieved from 
> reflect (I know that I can use java interop and 
> use standard java reflection api). 
>
> Here is and example of what I want to do: 
> user=> (require '[clojure.reflect :as r]) 
> user=> (def method-def (filter #(= "toString" (str (:name %)))  (:members 
> (r/reflect "aClass")))) 
>
> How do I invoke "toString" using "method-definition"? 
>
> Thanks and regards, 
> -- 
> Pablo Nussembaum 
>
>
>
>  what is better to use java interop using java reflection API or use 
> clojure.reflect to option 
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to