在我的clojure程序中,我无法访问java类com.foo.Foo的包范围字段,尽管我在命名空间"com.foo"中(通过我的clojure程序顶部的"(ns com.foo)").但是,com.foo.Foo中的公共字段是可访问的.
为什么?
这里有两个问题:
首先,命名空间 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
Run Code Online (Sandbox Code Playgroud)
其次,在查找构造函数或字段时,Clojure 编译器使用java.lang.Class 中的getConstructor和getFields方法,根据规范,它们仅返回公共构造函数和公共字段。
所以,这里运气不好。看来您将无法访问受包保护的字段。
编辑,回复评论。访问遗留 Java 代码中的包级字段的最佳方法是用 Java 编写一个类,该类包装现有类,并使用公共方法公开该类中的包保护方法和字段。这样,您可以更好地控制生成的类的名称和包。
该包装器是少量 Java 代码,您可以从那里访问 Clojure 代码中的字段。