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或更早版本。