2024 Clojure调查问卷中分享您的看法!

欢迎!请查阅关于页面,了解更多关于如何使用本站的信息。

–1
记录和类型

通过DynamicClassLoader加载的类对.getPackage返回nil。像CIDER和vim-fireplace这样的工具依赖这些信息来实现自动完成等功能。

(.getPackage String) ;; => #<Package package java.lang, Java平台API规范,版本1.7> (deftype T []) (.getPackage T) ;; => nil

建议:在DynamicClassLoader.defineClass()期间,对正在定义的类调用definePackage()方法(类似于URLClassLoader的做法)。

补丁:clj-1550-v4.patch

审核:Alex Miller

19个回答

0

评论者:bozhidar

原始代码可以通过与JVM抓取它的方式相同的方法从二进制名称中获取包名。(取出最后一个句点之前的前缀。)

我不完全理解您提出的解决方案。您能详细说明一下吗?

我认为应该撤销这个方案,让用户空间从二进制名称计算出包。

如果是的话,在新的JDKs上无需在用户空间或Clojure中进行更改,这也行。到现在为止,我对Clojure中能否修复这个问题已经失去了信心了。:-)

0
_评论者:gshayban_

https://github.com/clojure-emacs/orchard/blob/db6d8a7be853b52c9986c5af8d009639644bb390/src/orchard/java.clj#L157-L159

花了一些时间才找到这个,但不是请求包名然后获取符号,而是这样做

(defn package
  [^Class kls]
  (let [kls (.getName kls)
    idx (clojure.string/last-index-of kls \.)]
    (当 (pos? idx) 时)
      (subs kls 0 idx))))


0

评论者:alexmiller

补丁已回滚

0
参考: https://clojure.atlassian.net/browse/CLJ-1550(由bozhidar报告)
...