我在Clojure REPL上做了以下事情:
user=> (ns clojure.lang)
nil
clojure.lang=> (def tran (clojure.lang.LockingTransaction.))
#'clojure.lang/tran
clojure.lang=> (.getReadPoint tran)
这给出了以下结果:
IllegalArgumentException No matching field found: getReadPoint for class clojure.lang.LockingTransaction clojure.lang.Reflector.getInstanceField (Reflector.java:271)
现在这个方法does exist。
现在我认为我应该能够从REPL访问默认访问方法。
我可靠地告知Clojure命名空间与Java包不同。 (即解决这个问题的方法是通过反射 - 对于不需要在Java中反射的东西)。
为什么Clojure中的命名空间与用于互操作访问的Java包不一样?
答案 0 :(得分:0)
是类不是名称空间
boot.user=> (in-ns java.util.Date)
java.lang.ClassCastException: java.lang.Class cannot be cast to clojure.lang.Symbol
但是你得到的错误不是因为该字段不存在,而是因为它尚未正确初始化。这是一个Clojure并发原语,它需要使用java.util.concurrent.Callable进行实例化,实现这一点只是为了查看testing example类的末尾。
正确初始化时,java类返回有意义的输出:
boot.user=> (.getTime (java.util.Date.))
1445587895021
或
boot.user=> (def concurrent-queue (java.util.concurrent.ConcurrentLinkedQueue.))
#'boot.user/concurrent-queue
boot.user=> (.add concurrent-queue "example")
true
boot.user=> concurrent-queue
#object[java.util.concurrent.ConcurrentLinkedQueue 0x750ee622 "[example]"]