我没有找到根本原因,但你的代码对我来说不起作用,而我以前使用过这项技术,之前从未修改过JVM类的修饰符标志,因此我提供了一个对我来说工作的替代函数。与你的代码不同,它可以让调用者看到异常,并返回所有关键字,而不仅仅是特定命名空间中的关键字。这些更改不再是实质性的,只是不同的,但我怀疑getModifiers调用和setInt是完全没有必要的。
(defn all-kws []
(let [tf (.getDeclaredField clojure.lang.Keyword "table")]
(.setAccessible tf true)
(let [table (.get tf nil)]
(->> (.keySet table)
(map #(.get (.get table %)))))))
(def x (->> (all-kws)
(filter #(= (namespace %) "user"))))