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

Clojure 将类型符号转换为java.lang.Class实例,clojure,Clojure,我的问题是: 假设我需要clojure.reflect:as r,然后,例如,do (->> (r/reflect java.lang.String) :members (filter #(= (:name %) 'getBytes)) first :return-type) 这将计算为字节,它是一个符号。如何将该符号映射到Java类,也就是说,如何将函数

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

(->> (r/reflect java.lang.String)
                :members
                (filter #(= (:name %) 'getBytes))
                first
                :return-type)
这将计算为
字节
,它是一个符号。如何将该符号映射到Java类,也就是说,如何将函数
类型符号写入类

(assert
  (= (class (byte-array [1 2 3]))
     (type-symbol-to-class 'byte<>))) 
(断言)
(=(类(字节数组[1 2 3]))
(类型符号到类“字节”))

不抛出异常?如果该函数不仅仅适用于
byte

Clojure反射库在美化输出(包括参数/返回类型名称)方面做了大量的工作(,),并且进行反向转换不是一项简单的任务,那么这一点很好

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

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

这是一个非常好的答案!我不知道Java反射工具,但正如您所建议的,使用它们可能是首选方法。如果您想使用
clojure.reflect/reflect
,您也可以尝试
AsmReflector
,它不修饰类型名,而不是默认的
JavaReflector
,但它似乎只适用于Java 7或更早版本。