为什么命名空间与用于互操作访问的 Java 包不同?
Why aren't namespaces the same as Java packages for interop access?
我正在 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 互操作访问包不同?
是的class这些不是命名空间
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.
的 class 的末尾
正确初始化后java classes return 有意义的输出:
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]"]
我正在 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 互操作访问包不同?
是的class这些不是命名空间
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.
的 class 的末尾正确初始化后java classes return 有意义的输出:
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]"]