将类型符号转换为java.lang.Class实例

时间:2018-05-31 11:38:35

标签: clojure

这是我的问题: 假设我需要clojure.reflect :as r然后,例如,

(->> (r/reflect java.lang.String)
                :members
                (filter #(= (:name %) 'getBytes))
                first
                :return-type)

这将评估为byte<>这是一个符号。如何将该符号映射到Java类,也就是说,如何编写函数type-symbol-to-class以便

(assert
  (= (class (byte-array [1 2 3]))
     (type-symbol-to-class 'byte<>))) 

不会抛出异常?如果该函数适用于更多符号而不仅仅是byte<>

1 个答案:

答案 0 :(得分:7)

Clojure反射库做了很多工作(123)来美化输出(包括参数/返回类型名称),这不是一项简单的任务做反向变换。

如果您需要Class对象,则可以使用Java的反射工具而不是clojure.reflect

(= (->> java.lang.String
        .getDeclaredMethods
        (filter #(= (.getName %) "getBytes"))
        first
        .getReturnType)
   (class (byte-array [1 2 3]))) # -> true