分享您的想法,请参与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

有关删除补丁的说明,请参阅该页面上标题为“删除补丁”的部分。

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定义中,并像原始的'bean'代码那样与'method'进行或操作来修复了此问题

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报告)
...