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

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

-1
记录和类型

由DynamicClassLoader加载的类返回nil给.getPackage。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

更新补丁以便应用到当前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) ✗



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