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

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