gpt4 book ai didi

clojure - 如何标记 Clojure 函数以便可以通过 Java 反射识别它

转载 作者:行者123 更新时间:2023-12-03 00:31:10 24 4
gpt4 key购买 nike

我需要以某种方式将某些 Clojure 函数标记为“特殊”,以便 Java 代码可以使用反射来识别它们。我尝试向函数添加注释,但显然不支持。我尝试具体化一个扩展IFn的接口(interface)(以便Java代码可以识别函数对象),但这并没有什么好处,因为Clojure不直接使用具体化的方法作为实现 invoke 的代码,而是间接调用实际实现该方法的 Afunction 对象(我需要标记实际的 invoke方法与实际功能代码)。

有什么想法吗?

编辑:即使以可以使用 ASM 库访问的方式进行标记(而不是常规反射)也可以,但我需要以某种方式标记实际的 AFunction 对象或 调用方法。另外,我无法访问实际的 AFunction 对象 - 我需要标签在类上可见。

最佳答案

您可以使用 clojure 元数据功能,该功能允许将元数据(映射)附加到实现 IMeta 的任何对象。接口(interface)(结果是每个对象,因为 IObj 扩展 IMeta 并且每个对象都扩展 IObj)

现在有 2 个选项。

1) 您可以将元数据附加到 var(var 指向实际的 IFn 对象)

(defn hello {:name "hello"} [] 10)

在 Java 端,您可以获取 var hello 并使用 IMeta 方法来获取元数据并检测您的特定元数据是否存在。问题可能是您的 Java 代码直接访问/处理 IFn 对象而不是它们的变量(例如:匿名函数),要解决此问题,请尝试第二个选项。

2) 将元数据附加到函数对象本身:

(def hello (with-meta (fn [] 10) {:name "hello"}))

您不能使用 defn 将元数据附加到变量。上面的示例代码将元数据附加到函数对象本身。在 Java 端,将函数对象键入 IMeta 并进行检查。借助宏,可以将上面的代码变得更加 defn 风格,该宏作为练习:)

关于clojure - 如何标记 Clojure 函数以便可以通过 Java 反射识别它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com