【发布时间】:2023-03-03 04:34:01
【问题描述】:
这在 Clojure 中似乎比在 Java 和 Scala 中更难。我想做的是:
- 在 Java 中定义接口
- 在 Clojure 的一个类中实现它(奖励:使用宏)
- 使用类加载器和反射找到它
这是我目前所拥有的:
Java 接口
package hello.interfaces;
public interface Test {
String doSomething(String input);
}
Clojure 定义
(ns hello.impl.test
(:gen-class
:implements [hello.interfaces.Test]))
(defn doSomething [v] (str "hello " v))
搜索类:
(ns hello.core
(:import
(org.reflections Reflections)
(org.reflections.util ConfigurationBuilder))
(:gen-class))
(defn -instances []
(let [paths (into-array Object ["hello"])]
(.getSubTypesOf (Reflections. paths) hello.interfaces.Test)))
(defn -main [& args]
(println (-instances)))
我正在使用org.reflections。如果我搜索类路径中的类(例如在org.reflections jar 中),则此方法有效,但它不适用于我之前定义的类,因此我认为问题不在代码的最后一个 sn-p 中,而是在前一个,或者可能在使用中,例如它需要预编译。
如何在 Clojure 中定义以后可以通过反射找到的类?
【问题讨论】:
-
我必须说我对 Clojure 很陌生,这实际上是我正在尝试编写的第一段代码,很抱歉这个菜鸟问题。我对 Clojure 的主要兴趣是元编程,所以我希望使用宏实现接口的方式与这种用法兼容。在 Scala(以前的版本)中,我使用隐式转换而不是宏,但宏似乎更好地避免样板。
-
从来没有以这种方式使用过 Java 接口,只要确保你知道
instance?- stackoverflow.com/a/12170685/1327651 -
@nha 我还不了解 Clojure 的大部分内容。在这种情况下,
instance?不是一个合适的选项,因为它与对象一起检查它们是否是类的实例。我正在寻找类,一旦找到,首先要做的就是调用它们的构造函数来构建它们对应的对象。我正在尝试做的可能不是传统的。
标签: java reflection interface clojure classpath