clojure:无法访问同一个包中的非公共字段

时间:2011-04-04 15:42:44

标签: clojure

在我的clojure程序中,我无法访问java类com.foo.Foo的包范围字段,尽管我在命名空间“com.foo”中(通过我的clojure程序顶部的“(ns com.foo)”) )。但是,com.foo.Foo中的公共字段是可访问的。

为什么?

1 个答案:

答案 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中的方法getConstructorgetFields,按规范,它只返回public constructors和{ {3}}

所以,这里运气不好。您似乎无法访问受包受保护的字段。

修改,回答评论。在遗留Java代码中访问包级别字段的最佳方法是在Java中编写一个包装现有类的类,并使用公共方法从该类公开包受保护的方法和字段。这样,您可以更好地控制生成的类的名称和包。

这个包装器是少量的Java代码,从那里你可以访问Clojure代码中的字段。