欢迎!请参阅关于页面,了解更多的信息。
当在 JDK 11 上运行 Clojure 时,clojure.java.javadoc/javadoc 函数无法打开到 java.base 模块之外 JDK 类的正确 URL。
clojure.java.javadoc/javadoc
java.base
例如- (javadoc java.lang.String) 打开 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html- (javadoc java.sql.Connection) 打开 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/sql/Connection.html,这是不正确的,因为模块名称应该是 java.sql,而不是 java.base。正确的 URL 应为 https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/Connection.html
(javadoc java.lang.String)
(javadoc java.sql.Connection)
这是由 *core-java-api* 在 clojure.java.javadoc 命名空间中的定义引起的。
*core-java-api*
clojure.java.javadoc
我想知道是否有更好的方法来泛型处理所有标准 JDK 类,而不仅仅是 java.base 模块中的那些。
请注意,最初此问题是在 Emacs Cider 项目中提出的:https://github.com/clojure-emacs/cider/issues/2687
此修复已在1.10.2-alpha3版本中发布。
给定一个类 klass,在Clojure中您可以使用Java互操作来使用getModule方法确定它所在的模块名称,该方法是java.lang.Class类的一部分,链接为https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#getModule--
klass
getModule
java.lang.Class
然后使用结果模块的getName方法:https://docs.oracle.com/javase/9/docs/api/java/lang/Module.html#getName--
getName
例如:
user=> (.getName (.getModule java.sql.Connection)) "java.sql"
user=> (.getName (.getModule java.sql.Connection))
"java.sql"
看起来这样的URL从JDK 11开始,而不是从模块引入的JDK 9开始,因此不应在11之前的JDK上使用。
Juraj,我正在考虑为Clojure的javadoc创建一个提案补丁来改善这种情况,并意识到Clojure的javadoc也会尝试为除了Java自带库之外的其他库计算正确的URL。
你(或阅读这)认为这个在URL中包含模块名的想法是否也被除Java核心库之外的其他项目采用?
对于Java本身,是否包含Java模块名的决定因素似乎是“JDK是11或更高版本”。我已确认JDK 12文档遵循这一规则。JDK 13的文档在Oracle网站上尚未提供,因此还不知道那里的计划。