请在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 的成员
在 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。我通过在public-method定义中将zero-args检查内联并像原始'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报告)
...