(这个答案现在包括两个可行的解决方案,一个基于我最初的想法,intern
一个基于 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