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 不能访问FooImpl类中带有“public”修饰符的成员
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

我在代码中发现,如果没有读取方法,例如在拥有setCascade方法但没有任何getter的http://docs.cascading.org/cascading/2.0/javadoc/cascading/flow/hadoop/HadoopFlow.html对象中,可能会有空指针异常(NPE)。我在我们的代码中通过将is-zero-args检查内联在public-method定义中,并将整个东西与'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报告)
...