无法访问clojure中的java字段

时间:2015-06-29 22:05:33

标签: clojure

我有一个问题,我可以看到Java类/对象的字段,但我实际上无法访问它们。我可以通过两种方式看到这些领域。使用以下代码。

=>(require '[clojure.reflect :as r])    
=>(use '[clojure.pprint :only [print-table]])    
=>(print-table (sort-by :name (:members (r/reflect  myClass))))

并且还通过创建对象的实例。让我们说这些字段是一个用a表示的字符串,一个用word表示的字符串,以及一个用mylist表示的String ArrayList。

=>myObj
#<myClass 1 hello [world]>

在这两种情况下,我都可以看到这些字段存在。但是,当我运行以下代码时,我收到以下错误。

=>(. myObj mylist)
IllegalArgumentException No matching field found: mylist for class myClass clojure.lang.Reflector.getInstanceField (Reflector.java:271)

有谁知道发生了什么事?

为了回应Nicolas Modrzyk的回答,我运行(.- myFieild myObject)并获取     IllegalArgumentException找不到匹配的字段:myField for class myClass clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:308)

此外,这些字段不是私密的。我面前有Java源代码。

2 个答案:

答案 0 :(得分:2)

accessing java fields的正确表示法略有不同:

   (.-fieldName instance)

以下是java class File 及其私有字段 path 的完整示例:

    (require '[clojure.reflect :as r])   
    (use '[clojure.pprint :only [print-table]])    

    (import '[java.io File])
    (def f (File. "test.txt"))

    ; access a public static field
    (. File separator)
    ; "/"

    (print-table 
      (sort-by :name (:members (r/reflect  File))))

    (.-path f)
    ; java.lang.IllegalArgumentException: 
    ; No matching field found: path for class java.io.File

    (def field (.getDeclaredField File "path"))
    ; you need the below if the field is private
    (.setAccessible field true)

    ; get the value
    (.get field f)
    ; "test.txt"

答案 1 :(得分:0)

缩略图的评论是正确的。我不知道Java的默认访问是包。之后我通过反思访问了这些领域。谢谢大家的帮助。