我有一个问题,我可以看到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源代码。
答案 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的默认访问是包。之后我通过反思访问了这些领域。谢谢大家的帮助。