2024年Clojure状态调查!(a>分享您的想法!

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

–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

实际上,可能只是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 补丁回溯到主分支并保留了归属,没有语义上的变更。

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
对象[java.lang.Package 0x10993713 "包用户"]

## 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) ✗



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