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

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

0
Clojure

以下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$fnstrong1827$fnstrong1828 无法访问具有"public"修饰符的类 FooImpl 的成员
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>,相同的操作可以成功。

8个答案

0

评论者:charles-dyfis-net

修复不准确的帮助文档字符串

0

评论者:charles-dyfis-net

Apache Commons Beamutils 在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+workflow](http://dev.clojure.org/display/design/JIRA workflow)

有关移除补丁的说明在该页面的“移除补丁”标题下。

0

评论者:charles-dyfis-net

已添加按照说明过程创建的补丁。

0

评论者:gtrak

我在我的代码中发现,如果没有读取方法,例如在并没有getter的具有setCascade方法的http://docs.cascading.org/cascading/2.0/javadoc/cascading/flow/hadoop/HadoopFlow.html对象上,是可能得到一个NPE的。我在我们的代码中通过将is-zero-args检查内联到public-method定义中,并像原始的'bean'代码那样与'method'进行and操作解决这个问题,如下所示

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](https://clojure.atlassian.net/browse/CLJ-978)(由charles-dyfis-net报告)
...