请在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 有自己的实现,这 notable,它尝试反映具有给定签名的成员并捕获失败时的异常,而不是迭代整个成员列表。这可能是一个更好的方案 -- 我对异常处理的开销与反射整个类的完整方法列表相比不太熟悉。

0

评论由:charles-dyfis-net 提供

补丁的先前版本缺少新的测试套件文件。已纠正。

0

评论由:jafingerhut

感谢你的补丁,Charles。请按照以下要求创建补丁并将其附加,然后删除过时的补丁。创建补丁的说明在此页的“开发”标题下: http://dev.clojure.org/display/design/JIRA 工作流程

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

0

评论由:charles-dyfis-net 提供

按照文档化流程添加了补丁。

0

评论由:gtrak

我在代码中发现,如果没有read-method,就有可能得到NPE,例如http://docs.cascading.org/cascading/2.0/javadoc/cascading/flow/hadoop/HadoopFlow.html对象,该对象具有setCascade方法但没有getter。我通过在public-method定义中内联is-zero-args检查并将整个内容与'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报告)
...