2024 Clojure现状调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于如何使用此信息的信息。

-1
记录和类型

由DynamicClassLoader加载的类返回.getPackage为nil。CIDER和vim-fireplace等工具依赖此信息来实现像自动补全提示等功能。

(.getPackage String) ;; => #<Package package java.lang, Java Platform API Specification, version 1.7> (deftype T []) (.getPackage T) ;; => nil

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

补丁:clj-1550-v4.patch

审核:Alex Miller

19 答案

0

评论由:alexmiller做出

根据http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getPackage(),此方法返回类加载器找到的包信息,如果没有则返回null。根据规范,我并不认为当前的行为是错误的。我需要进一步实验以查看这是否不同寻常。

0

由:bozhidar做出评论

有关该问题的 background:有关链接:https://github.com/clojure-emacs/cider-nrepl/pull/127。我对这个主题不是专家,但能够获取除包外的所有类信息对我来说确实看起来很奇怪。

0
by

评论者:hiredman

如果你进行了AOT编译(为deftype在磁盘上生成类文件),getPackage工作正常,这似乎表明这是一个jvm问题

0
by

评论者:hiredman

实际上,问题可能是dynamicclassloader没有为它加载的类定义一个包

0
by

评论由:alexmiller做出

是的,我认为这是正确的。

0
by

评论者:stu

这里没有问题说明。需要包信息做什么?

0
by

由:bozhidar做出评论

我已在上文中链接了问题。基本上,CIDER和vim-fireplace等工具依赖于这些信息来实现像自动完成这样的功能。
当运行应用程序时可能没有问题,但在检查它们的状态时,这绝对是一个问题...

0
by

评论者:michaelblume

将/Packate/改为/Package

0
by

评论由:alexmiller做出

将补丁刷新并应用到当前的master上,版权保留,没有语义上的更改。已标记为已预筛选。

0

评论者:gshayban

我们应考虑与 JDK9 模块系统的交互

0

评论由:alexmiller做出

据我所知,这似乎不会对 JDK9 模块系统产生负面影响

0

评论由:alexmiller做出

v4 补丁重新基于 master 和保留归属,没有语义上的变化。

0

由:bozhidar做出评论

Alex,这将包含在 Clojure 1.10 中吗?

0

评论由:alexmiller做出

这是当前的路径...

0
_评论者:gshayban_

这是一个坏补丁,不小心通过了。上面的动机链接显示了 nREPL 摘录,它试图符号化包,基本上

(symbol (.getName (.getPackage TheClass))). 原始代码可以通过与 JVM 相同的方式从二进制名称中推导出包名。(取到最后一个点为止的前缀。)

修复还引入了一个已弃用的调用,并在类加载时增加了更多的工作(这是关键路径)。

作为附带说明,JDK9+ 在类定义时自动从二进制名称定义一个包


## JDK 8
➜  clojure git:(f5cfd24d) ✗ docker run --rm -v $HOME/.m2:/m2 openjdk:8-slim java -jar /m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar -e '(deftype T [])' -e '(or (.getPackage T) :nada)'
user.T
:nada

## JDK 9
➜  clojure git:(f5cfd24d) ✗ docker run --rm -v $HOME/.m2:/m2 openjdk:9-slim java -jar /m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar -e '(deftype T [])' -e '(or (.getPackage T) :nada)'
user.T
#object[java.lang.Package 0x10993713 "package user"]

## JDK 11
➜  clojure git:(f5cfd24d) ✗ docker run --rm -v $HOME/.m2:/m2 openjdk:11-slim java -jar /m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar -e '(deftype T [])' -e '(or (.getPackage T) :nada)'
user.T
#object[java.lang.Package 0x6f3c660a "package user"]
➜  clojure git:(f5cfd24d) ✗



我认为这应该被撤销,并让用户空间从二进制名称计算包。
...