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$fn1827$fn1828无法访问具有"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 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+workflow](http://dev.clojure.org/display/design/JIRA workflow)

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

0

评论由[charles-dyfis-net](#)发表

已添加根据文档过程创建的补丁。

0

由:gtrak

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

public-method (xor 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报告)
...