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

欢迎!请查看关于页面以了解更多关于这个工作方式的信息。

–1
Records and Types

由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(),该方法返回由类加载器找到的包信息,如果没有则返回null。对我来说,目前的行为并未违反规范。我需要进一步实验来了解这是否不寻常。

0

评论者:bozhidar

关于该问题的背景链接:[https://github.com/clojure-emacs/cider-nrepl/pull/127](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补丁重构到master版本并保留原作者名称,没有语义更改。

0

评论者:bozhidar

亚历克斯,这个特性会被包含在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 "包 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 "包 user"]
➜  clojure git:(f5cfd24d) ✗



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