2011-11-02 7 views

答えて

8

Javaリフレクションを使用します。

がクラスを取得します。メソッドを取得するには、メソッドの配列を提供する、

(.getMethods (.getClass myObject)) 

があります。シーケンスのように扱うことができます。私はおそらくそう、ベクターにそれを置くだろう:

(vec (.getMethods (.getClass myObject))) 
1

IIRCそれは内蔵のではないですが、それはまたsee this implementationをshort--ています。

(それは今かもしれません。)

2

あなたは(Clojureの1.2.0、Clojureの-contribの1.2.0で、例えば)この種のもののためにshowを使用することができるように使用されます。 REPL

(show Integer) 

から

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

=== 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") 

は、あなたのオブジェクトに "foo" を置き換えます。

8

バージョン1.3以降、Clojureにはclojure.reflect名前空間がバンドルされています。特に、関数reflectは、オブジェクトのすべてのメソッド(およびその他の情報)を表示するために使用できます。 showと同じように使用すると便利ではありません。一方、それははるかに一般的で、showの独自のバージョンをreflectをビルディングブロックとして使用することは非常に簡単です。

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

あなたがmethod..sayすべての特定の種類を探しているので、あなたは通常、このメソッドのリストを実行します。あなたは文字列を返す文字列のためのすべてのメソッドを表示する場合の例として

、クラス内のメソッドの「取得」。ここでは、あなたのオブジェクトは 'objのことを行うことができる方法である。

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

#は、「GET」自分の名前(自分のニーズに合わせてカスタマイズ)で取得していた方法を検索するための正規表現オブジェクトです。マップ式は、単にオブジェクトのクラス内のすべてのメソッド名のseqを生成します。 seqは、フィルターに渡された最初のパラメーターである無名関数に供給されます。

関連する問題