如何在Clojure中从Java声明的字段中获取数组元素的类型?

时间:2015-05-28 14:27:12

标签: java reflection clojure

以下代码

(-> (.getField (Class/forName
                "ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
     "wordsTuples") .getType)

告诉我wordsTuplesjava.util.ArrayList。但我希望能够学到的是它是一个 ArrayList,其元素类型为String[] ,因为它碰巧被声明为:

public class Dictionary extends ProcessNode {
    public ArrayList<String[]> wordsTuples;

    public ArrayList<String> words;
...

有没有办法获得&#34;类型提示&#34;在Clojure中以编程方式提供信息?

2 个答案:

答案 0 :(得分:0)

您可以根据列表中的数据使用简单的黑客。

E.g。你有一些字符串列表:

(def lst (java.util.ArrayList. ["my" "list" "of" "strings"]))

然后你可以获得项目类型:

(if (and (instance? java.util.List lst) 
         (not (.isEmpty lst))) 
   (.getName (.getClass (.get lst 0))))

这种解决方法的缺点是你无法获得freakhill提到的关于清空的清单b / c的反射信息,但谁关心空列表;)?

希望这有帮助。

答案 1 :(得分:0)

感谢您的评论,我在问题mixIn上找到了this answer。从那里,我的示例代码的简单修改现在可以按预期工作:

#<ParameterizedTypeImpl java.util.ArrayList<java.lang.String[]>>

返回:

{{1}}