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

欢迎!有关如何使用本网站的更多信息,请参阅关于 页面。

–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

实际上,可能仅仅是因为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)'
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) ✗



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