在我的clojure程序中,我无法访问java类com.foo.Foo的包范围字段,尽管我在命名空间“com.foo”中(通过我的clojure程序顶部的“(ns com.foo)”) )。但是,com.foo.Foo中的公共字段是可访问的。
为什么?
答案 0 :(得分:1)
这里有两个问题:
首先,命名空间com.foo被编译为包com中的类foo_whatever;它是不编译到com.foo包中的类。
请参阅:
user> (ns com.foo)
nil
com.foo>
nil
com.foo> (defn hello[] "hello !")
#'com.foo/hello
com.foo> (class hello)
com.foo$hello
com.foo> (ns com.foo.hello)
nil
com.foo.hello> (defn hi[] "hi !")
#'com.foo.hello/hi
com.foo.hello> (class hi)
com.foo.hello$hi
其次,在查找构造函数或字段时,Clojure编译器使用java.lang.Class中的方法getConstructor和getFields,按规范,它只返回public constructors和{ {3}}
所以,这里运气不好。您似乎无法访问受包受保护的字段。
修改,回答评论。在遗留Java代码中访问包级别字段的最佳方法是在Java中编写一个包装现有类的类,并使用公共方法从该类公开包受保护的方法和字段。这样,您可以更好地控制生成的类的名称和包。
这个包装器是少量的Java代码,从那里你可以访问Clojure代码中的字段。