tutorial - install clojure




如何從Clojure獲取Java類的方法? (4)

如何從Clojure獲取Java類的方法?


[編輯2]

Per M Smith在下面的評論中,這完成了相同但按方法名稱提供排序,只返回方法:

(print-table
  (sort-by :name 
    (filter :exception-types (:members (r/reflect "foo")))))

[/編輯2]

[編輯]

我的原始答案是指Clojure 1.2,但Clojure 1.3已經改變了。 現在可以在不依賴Clojure的contrib庫的情況下工作:

(require '[clojure.reflect :as r])
(use '[clojure.pprint :only [print-table]])

(print-table (:members (r/reflect "foo")))

這提供了一種更加分離的方法, reflect函數提供有關傳入的參數的各種信息(在本例中為String "foo" ), print-table函數採用任何通用的表格數據結構並將其打印為這樣。

這最初來自谷歌集團的這個主題

[/編輯]

我將在clojure.contrib.repl-utils命名空間中使用show函數,該命名空間將打印對象(或對象的類)的所有靜態和實例成員。 我這樣要求:

(require '[clojure.contrib.repl-utils :as ru])

以下是使用Joda Time的示例:

(import 'org.joda.time.DateTime)
(ru/show DateTime)
(ru/show (DateTime.))

第一個示例演示瞭如何簡單地將類傳遞給show ,而第二個示例演示了您也可以傳遞類的實例。

這當然適用於下面是Java類的許多Clojure項目。 以下是查看java.lang.String實例可用的所有方法的示例:

(ru/show "foo")

嘗試clojure.reflect ,可在最近的Clojure 1.3.0-alpha *版本中找到。 它返回您可以根據需要搜索/過濾的Clojure數據結構。

Clojure 1.3.0-alpha6
user=> (use 'clojure.reflect 'clojure.pprint)
nil
user=> (pprint (reflect "hello"))
{:bases
 #{java.io.Serializable java.lang.Comparable java.lang.Object
   java.lang.CharSequence},
 :flags #{:public :final},
 :members
 #{{:name valueOf,
    :return-type java.lang.String,
    :declaring-class java.lang.String,
    :parameter-types [boolean],
    :exception-types [],
    :flags #{:static :public}}
...

此代碼將打印聲明和繼承的所有公共方法。

(doseq [m (.getMethods (type "Hello"))]
  (println "Method Name: " (.getName m))
  (println "Return Type: " (.getReturnType m) "\n"))

試試我的新圖書館:

http://github.com/zcaudate/iroh

(.? String  #"^c" :name)
;;=> ["charAt" "checkBounds" "codePointAt" "codePointBefore"
;;    "codePointCount" "compareTo" "compareToIgnoreCase".   
;;    "concat" "contains" "contentEquals" "copyValueOf"]






clojure