以下Java代码作为示例
`
public interface IFoo {
String getBar();
}
class FooImpl {
String getBar() { return "bar"; }
}
`
按照目前的实现方式,{{(bean my-foo)}}会尝试调用以下内容
(. #<Method public java.lang.String FooImpl.getBar> (invoke my-foo nil))
但是,由于{{FooImpl}}不是公共的,所以失败了
`
java.lang.IllegalAccessException: 类 clojure.core$bean$fn1827$fn1828 不能访问FooImpl类中带有“public”修饰符的成员
at sun.reflect.Reflection.ensureMemberAccess (Reflection.java:65)
java.lang.reflect.Method.invoke (Method.java:588)
clojure.core$bean$fn__1827$fn__1828.invoke (core_proxy.clj:382)
clojure.core$bean$v__1832.invoke (core_proxy.clj:388)
clojure.core$bean$fn__1838$thisfn__1839$fn__1840.invoke (core_proxy.clj:406)
clojure.lang.LazySeq.sval (LazySeq.java:42)
clojure.lang.LazySeq.seq (LazySeq.java:60)
clojure.lang.RT.seq (RT.java:473)
`
然而,如果我们调用#<Method public java.lang.String Foo.getBar>
而不是#<Method public java.lang.String FooImpl.getBar>
,那么同样的操作就会成功。