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

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

-1
记录和类型

由DynamicClassLoader加载的类在.getPackage上返回null。CIDER和vim-fireplace等工具依赖于这些信息来实现如补全提示等功能。

(.getPackage String) ;; => #<Package package java.lang, Java平台API规范,版本1.7> (.getPackage T) ;; => nil

建议:在DynamicClassLoader.defineClass()期间,对正在定义的类调用definePackage()(类似于URLClassLoader所做的那样)。

补丁:clj-1550-v4.patch

由:Alex Miller

19 个答案

0

评论:by alexmiller

根据http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getPackage(),该方法返回由类加载器找到的包信息;如果没有找到,则返回null。对我来说,目前的行为并没有明显违反规范。我需要更多实验才能看到这是否不同寻常。

0

评论:by bozhidar

有关此问题的背景信息(链接:https://github.com/clojure-emacs/cider-nrepl/pull/127)。我对这个主题不是专家,但我认为能够获取除包之外的所有类信息确实看起来很奇怪。

0
by

评论者:hiredman

如果你进行 ahead-of-time(AOT) 编译(为 deftype 生成磁盘上的类文件),getPackage 功能正常工作,这让我推测这是 JVM 的问题

0
by

评论者:hiredman

实际上,很可能是因为 dynamicclassloader 没有为它加载的类定义包

0
by

评论:by alexmiller

是的,我相信这是正确的。

0
by

评论者:stu

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

0
by

评论:by bozhidar

我已经链接了上面的问题。基本上,CIDER 和 vim-fireplace 等工具体现在需要此类信息来实现自动完成等特性。
当运行您的应用时可能这不是问题,但在检查它们的状态时绝对是一个问题……

0
by

评论者:michaelblume

将“Packate”改为“Package”

0
by

评论:by alexmiller

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

0

由:gshayban发表的评论

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

0

评论:by alexmiller

据我所知,我看不出这会对JDK9模块系统造成任何负面影响

0

评论:by alexmiller

v4补丁重置到主分支并保留归属,没有语义变化。

0

评论:by bozhidar

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

0

评论:by 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
java.lang.Package 对象 0x6f3c660a "用户包"]
➜  clojure git:(f5cfd24d) ✗



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