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

查尔斯,感谢你的补丁。你能请按照所需格式创建一个补丁,并附加它,然后删除旧的补丁吗?创建补丁的说明位于本页“开发”标题下:http://dev.clojure.org/display/design/JIRA workflow

关于删除补丁的说明在该页的“删除补丁”部分下。

0

评论者:charles-dyfis-net

按照记录的过程添加了补丁。

0

评论者:gtrak

我在代码中发现,如果没有读取方法,就可能出现 NPE,例如在一个拥有 setCascade 方法但没有 getter 的 http://docs.cascading.org/cascading/2.0/javadoc/cascading/flow/hadoop/HadoopFlow.html 对象上。我通过将零参数检查内置到公共方法定义中,并将其与原始 '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

查尔斯,我认为我们应该效仿 Apache BeanUtils。未抛出的异常成本低。通常,用于控制流程的异常是不好的,但这是由反射 API 的糟糕设计强加的。

0
参考:https://clojure.atlassian.net/browse/CLJ-978(由 charles-dyfis-net 报告)
...