请参与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

有关此问题的背景信息,请参考 https://github.com/clojure-emacs/cider-nrepl/pull/127。我对这个主题并不是专家,但能够获得除了包信息以外的所有类信息确实看起来有些奇怪。

0

评论者:hiredman

如果你对deftype进行了AOT编译(在磁盘中生成类文件),getPackage函数表现正常,这让我怀疑是JVM的问题

0

评论者:hiredman

实际上,这可能仅仅是因为dynamicclassloader为所加载的类没有定义包

0

评论者:alexmiller

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

0

评论者:stu

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

0

评论者:bozhidar

我已经链接了上面的问题。基本上,CIDER和vim-fireplace之类的工具依赖于这些信息来实现诸如自动完成提示等功能。
这可能不会影响你的应用运行,但在检查它们的运行状态时,这绝对是一个问题...

0

评论者:michaelblume

将“Packate”更正为“Package”

0

评论者:alexmiller

已更新补丁以应用到当前主分支,保留归属,未进行语义更改。已标记预筛选。

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)'
用户.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)'
用户.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)'
用户.T
#object[java.lang.Package 0x6f3c660a "package user"]
➜  clojure git:(f5cfd24d) ✗



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