2024年Clojure状态调查!中分享您的想法。

欢迎!有关如何使用本站点的更多信息,请参阅关于页面

0
Clojure

以下是一个Java示例:

`
public interface IFoo {
String getBar();
}

class FooImpl {
String getBar() { return "bar"; }
}
`

As presently implemented, {{(bean my-foo)}} tries to invoke the following

(. #<Method public java.lang.String FooImpl.getBar> (invoke my-foo nil))

However, as {{FooImpl}} is not public, this fails

`
java.lang.IllegalAccessException: Class clojure.core$bean$fn1827$fn1828 can not access a member of class FooImpl with modifiers "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)

`

However, the same thing succeeds if we call rather than .

8 个答案

0

由:charles-dyfis-net

修复错误文档字符串

0

由:charles-dyfis-net

Apache Commons Beanutils在自己的实现中对此进行了处理,在http://www.docjar.com/html/api/org/apache/commons/beanutils/MethodUtils.java.html#771 -- 尤其是它尝试反射具有给定签名的方法,并在失败时捕获异常,而不是遍历整个方法列表。这可能是一个更好的方法 -- 我对这个异常处理的成本与反思类完整方法列表的成本相比不熟悉。

0

由:charles-dyfis-net

补丁的早期版本缺少新的测试套件文件。已修正。

0

评论者:jafingerhut

感谢您提供的补丁,Charles。请按照所需格式创建一个补丁并附上,然后删除旧的补丁。创建补丁的说明在页面标题为“开发”的部分: http://dev.clojure.org/display/design/JIRA工作流程

移除补丁的说明在同一个页面标题为“移除补丁”的部分。

0

由:charles-dyfis-net

已添加按文档流程创建的补丁。

0

评论者:gtrak

我在代码中发现,如果没有read-method,就可能遇到空指针异常(NPE),例如在具有setCascade方法但没有getter的http://docs.cascading.org/cascading/2.0/javadoc/cascading/flow/hadoop/HadoopFlow.html对象上。我们通过将is-zero-args检查内联到public-method定义中,并将整个内容与'method'进行与操作,按照原始'bean'代码的方式修复了此问题,如下所示

public-method (and method (zero? (alength (. method (getParameterTypes)))))

              (or (and (java.lang.reflect.Modifier/isPublic (. c (getModifiers)))
                                                       method)
                                                  (public-version-of-method method)))
0

评论者:richhickey

Charles,我认为我们应该遵循Apache BeanUtils的做法。不抛出的异常成本低。通常,异常对控制流程不好,但这是由反射API的设计不当造成的。

0
参考:https://clojure.atlassian.net/browse/CLJ-978(由charles-dyfis-net报告)
...