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

评论者: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
#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) ✗



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