在Clojure中,我可以使用什麼函數來查看Java對象的方法?如何查看與Clojure中的對象關聯的方法?
user=> (some-function some-java-object)
... lots of methods ...
在Clojure中,我可以使用什麼函數來查看Java對象的方法?如何查看與Clojure中的對象關聯的方法?
user=> (some-function some-java-object)
... lots of methods ...
使用java反射。
(.getClass myObject)
讓你上課。要獲得方法,
(.getMethods (.getClass myObject))
這給你一個方法數組。你可以把它看作一個序列;我可能會把它變成一個載體,所以:
(vec (.getMethods (.getClass myObject)))
IIRC它不是內置的,但它也很短 - see this implementation。
(它現在可能還。)
你以前可以使用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
似乎也打破了。
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")
替換「富」與你的對象。
從版本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)
這是否適用於v1.2.1(如果我將依賴項添加到project.clj文件中)? –
不,它只在1.3 – Jonas
你通常做這種方法房源班上的「獲得」類方法。這裏是你如何能做到這一點對你的對象「OBJ」:
(filter #(re-find #"get" %) (map #(.getName %) (.. obj getClass getMethods)))
的#「獲得」正則表達式要搜索的對象有獲得他們的名字(自定義爲你自己需要的)方法。映射表達式只是生成對象類中所有方法名稱的seq; seq被饋送到匿名函數,這是傳遞給過濾器的第一個參數。
in 1.2.0你包括/用什麼來獲得這個?它在覈心嗎? –
@Arthur它在clojure.contrib.repl-utils。我添加了上面的命名空間宏來澄清。 –
所以這不工作了? –