(Этот ответ теперь включает в себя два рабочих решения, одно из которых основано на моей первоначальной идее с intern
, а другое - на предложении Данлея использовать 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
Обновление: (оставляя первое обновление на месте в качестве альтернативного решения)
Сочетание знаний Данлея о 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
может дать вам правильные идеи, если мой набросок выше превратится как-то неправильно.