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

如果你进行AOT编译(在磁盘上为deftype生成一个类文件),getPackage就能正常工作,这让我推测这是一个JVM问题。

0

评论者:hiredman

实际上,这只可能是动态类加载器没有为它所加载的类定义包。

0

评论人:alexmiller

是的,我认为这是正确的。

0

评论者:stu

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

0

评论人:bozhidar

我已经链接了上面的一个问题。基本上,像CIDER和vim-fireplace这样的工具正在依赖这些信息来实现像自动完成提示等功能。
这可能不是运行你的应用程序时的问题,但当你检查它们的状况时,这显然是一个问题...

0

评论者:michaelblume

在/Packate/Package之间进行更改。

0

评论人:alexmiller

刷新补丁以应用于当前主分支,保留归属权,无语义更改。标记为预筛选。

0
by

评论者:gshayban

我们应该考虑在这里与 JDK9 模块系统的交互

0
by

评论人:alexmiller

从我的直观理解来看,我认为这对 JDK9 模块系统不会有任何负面作用

0
by

评论人:alexmiller

v4 补丁重新基础到主分支,保留归档,没有语义上的更改。

0
by

评论人:bozhidar

Alex,这个将会包含在 Clojure 1.10 中吗?

0
by

评论人:alexmiller

这就是当前的路径...

0
by
_评论者: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) ✗



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