2011-11-02 63 views

回答

8

使用java反射。

(.getClass myObject) 

讓你上課。要獲得方法,

(.getMethods (.getClass myObject)) 

這給你一個方法數組。你可以把它看作一個序列;我可能會把它變成一個載體,所以:

(vec (.getMethods (.getClass myObject))) 
2

你以前可以使用show對於這樣的事情(例如,使用Clojure 1.2.0,Clojure的-的contrib 1.2.0)。

(ns test.core 
    (:use [ clojure.contrib.repl-utils :only [show]])) 

從REPL

(show Integer) 

產生

=== public final java.lang.Integer === 
static MAX_VALUE : int 
static MIN_VALUE : int 
... 

奇怪的是,我試圖與Clojure的1.3.0/Clojure的-的contrib 1.2.0並沒有奏效。 doc似乎也打破了。

+0

in 1.2.0你包括/用什麼來獲得這個?它在覈心嗎? –

+0

@Arthur它在clojure.contrib.repl-utils。我添加了上面的命名空間宏來澄清。 –

+0

所以這不工作了? –

3
user=> (map #(.getName %) (-> "foo" class .getMethods)) 

("equals" "toString" "hashCode" "compareTo" "compareTo" "indexOf" "indexOf" "indexOf" "indexOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "valueOf" "length" "isEmpty" "charAt" "codePointAt" "codePointBefore" "codePointCount" "offsetByCodePoints" "getChars" "getBytes" "getBytes" "getBytes" "getBytes" "contentEquals" "contentEquals" "equalsIgnoreCase" "compareToIgnoreCase" "regionMatches" "regionMatches" "startsWith" "startsWith" "endsWith" "lastIndexOf" "lastIndexOf" "lastIndexOf" "lastIndexOf" "substring" "substring" "subSequence" "concat" "replace" "replace" "matches" "contains" "replaceFirst" "replaceAll" "split" "split" "toLowerCase" "toLowerCase" "toUpperCase" "toUpperCase" "trim" "toCharArray" "format" "format" "copyValueOf" "copyValueOf" "intern" "wait" "wait" "wait" "getClass" "notify" "notifyAll") 

替換「富」與你的對象。

8

從版本1.3開始,Clojure與clojure.reflect命名空間捆綁在一起。功能reflect尤其可用於顯示對象的所有方法(和其他信息)。使用方式不如show。另一方面,它更通用,使用reflect作爲構建塊可以很容易地編寫自己的show版本。

舉個例子,如果你想看到的字符串的所有方法返回一個字符串:因爲你正在尋找一個特定類型method..say的所有

user=> (use 'clojure.reflect) 
user=> (use 'clojure.pprint) 

user=> (->> (reflect "some object") 
      :members 
      (filter #(= (:return-type %) 'java.lang.String)) 
      (map #(select-keys % [:name :parameter-types])) 
      print-table) 
+0

這是否適用於v1.2.1(如果我將依賴項添加到project.clj文件中)? –

+0

不,它只在1.3 – Jonas

1

你通常做這種方法房源班上的「獲得」類方法。這裏是你如何能做到這一點對你的對象「OBJ」:

(filter #(re-find #"get" %) (map #(.getName %) (.. obj getClass getMethods))) 

的#「獲得」正則表達式要搜索的對象有獲得他們的名字(自定義爲你自己需要的)方法。映射表達式只是生成對象類中所有方法名稱的seq; seq被饋送到匿名函數,這是傳遞給過濾器的第一個參數。

相關問題