请在 Clojure 2024 状态调查 中分享您的想法!

欢迎!请参阅 关于 页面以获取有关该工作方式的一些更多信息。

–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

评论者: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

如果在AOT编译(在磁盘上为deftype生成一个类文件)时,getPackage可以正常工作,这让我认为这可能是一个JVM的问题

0
答者

评论者:hiredman

实际上,这很可能是因为动态类加载器没有为它加载的类定义一个包

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 补丁回滚到 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) ✗



我认为应该撤销这一修改,并允许用户空间根据二进制名称计算包。
...