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

欢迎!请查看关于页面了解此功能的一些更多信息。

–1 投票
记录与类型

由DynamicClassLoader加载的类返回nil的.getPackage。例如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(),此方法返回由class loader找到的包信息,如果不存在,则返回null。我不确定当前的这种行为是否与规范无误。我需要进一步实验才能确定这是否不同寻常。

0 投票

评论者:bozhidar

关于问题的一些背景说明(链接:https://github.com/clojure-emacs/cider-nrepl/pull/127)。我对这个话题并非专家,但是能够获取所有的类信息除了其包确实让我感到很奇怪。

0 投票
创作者:

评论者:hiredman

如果你AOT编译(为deftype在磁盘上生成一个类文件),getPackage运行正常,这表明我认为这是JVM问题

0 投票
创作者:

评论者:hiredman

实际上,可能只是dynamicclassloader没有为它加载的类定义包

0 投票
创作者:

评论者:alexmiller

是的,我相信这是正确的。

0 投票
创作者:

评论者:stu

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

0 投票
创作者:

评论者:bozhidar

我已经链接了上面的问题。基本上,像CIDER和vim-fireplace这样的工具依赖这些信息来实现诸如自动完成等操作。
当运行你的应用时可能没有问题,但当检查它们的状态时绝对有问题...

0 投票
创作者:

评论者:michaelblume

把 "Packate" 改成 "Package"。

0 投票
创作者:

评论者:alexmiller

更新补丁以应用于当前master,保留归功于,无语义更改。已标记预筛选。

0 投票

评论由:gshayban 发布

在这里,我们应该考虑与 JDK9 模块系统的交互

0 投票

评论者:alexmiller

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

0 投票

评论者:alexmiller

v4 补丁基于主分支进行回退,并保留了归因信息,没有语义更改。

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) ✗



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