2024 State of 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
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) ✗



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