(この回答には 2 つの実用的なソリューションが含まれています。1 つは私の最初のアイデアに基づくものでintern
、もう 1 つは を使用するという danlei の提案に基づいていますc.c.import-static
。後でこれをクリーンアップする必要があると思いますが、今はそれ以上の時間を費やすことはできません。 ...)
静的フィールドを抽出するには:
(filter #(bit-and java.lang.reflect.Modifier/STATIC (.getModifiers %))
(.getFields YourClass))
#(intern *ns* (str "a-prefix-" (.getName %)) (.get YourClass nil))
次に、そのシーケンス全体にマップして値を取得します...このビットはテストされていないことに注意してください。特にnil
、.get
; 試してjava.lang.Field
みて、クラスで何が機能するかを確認してください。
更新 2:
わかりました、実際には、intern
ベースド アプローチは可読性に関してそれほど悪くはありません。
user> (map #(intern *ns* (symbol (str "integer-" (.getName %))) (.get % java.lang.Integer))
(filter #(bit-and java.lang.reflect.Modifier/STATIC
(.getModifiers %))
(.getFields java.lang.Integer)))
(#'user/integer-MIN_VALUE #'user/integer-MAX_VALUE #'user/integer-TYPE #'user/integer-SIZE)
user> integer-MIN_VALUE
-2147483648
user> integer-MAX_VALUE
2147483647
user> integer-TYPE
int
user> integer-SIZE
32
更新: (代替ソリューションとして最初の更新をそのままにしておきます)
上記の danlei の知識を組み合わせるclojure.contrib
と、次の結果が得られます。
user> (map #(eval `(import-static java.lang.Integer ~(symbol (.getName %))))
(filter #(bit-and java.lang.reflect.Modifier/STATIC
(.getModifiers %))
(.getFields java.lang.Integer)))
(#'user/MIN_VALUE #'user/MAX_VALUE #'user/TYPE #'user/SIZE)
user> MIN_VALUE
-2147483648
user> MAX_VALUE
2147483647
user> TYPE
int
user> SIZE
32
それは使用しeval
ます...まあ、それは、「パフォーマンスを殺す」ことはほとんどなく、実際にはかなり読みやすいですが、これは精巧な表現を使用してintern
もそうではないかもしれません. (実際にはそれほど悪くはありません... :-))ただし、 上記のスケッチが何らかの形で間違っていることが判明した場合、少なくとも の実装により適切なアイデアが得られます。intern
import-static