【问题标题】:Custom accessor strategy for Clojure `from-java`Clojure `from-java` 的自定义访问器策略
【发布时间】:2020-02-03 06:24:35
【问题描述】:

有没有办法自定义clojure.java.data/from-java中使用的访问器策略? from-javajava.data function lib 的一部分。

我最近更新了一个第三方 Java 库,它曾经遵循 JavaBean getset 模式。但是,在更新后,他们从 getProperty() 变为 property()...

我猜这个更改导致 from-java 函数在这种情况下不适合,这并不奇怪,因为对象不再是正确的 JavaBeans。

有什么方法可以让from-java 知道这个访问器模式,或者有没有其他支持这个的递归映射机制?

【问题讨论】:

  • 正如人们在他们的回答中所指出的那样,正如您在您的问题中所怀疑的那样,clojure.java.data 旨在与 JavaBeans 一起使用并构建在该 API 的底层——所以如果 Java 不认为你有一个“bean”,java.data 帮不了你太多。

标签: java clojure mapping interop javabeans


【解决方案1】:

from-java 是一个多方法,你可以为任何你喜欢的类覆盖它吗?没有教它一个替代命名约定的机制(如果有这样的机制,我想它会遇到“每个具有任何名称的方法都代表一个属性”的问题)。因此你必须写manual conversions,但至少会为你处理递归。

【讨论】:

  • 谢谢@amalloy,你证实了我的怀疑。我希望我不必使用多方法覆盖,因为我正在处理大量不同的类。但是,正如你所说,至少我会处理递归......
【解决方案2】:

看来您必须自己扩展多方法以支持这些类,但是,您可能可以使用反射(我知道很慢)来构建一些非常通用的东西:

  • 对于给定的对象实例,找到它的类,然后是类'DeclaredFields,并从每个字段中获取它们的名称和类型
  • 对于同一个实例,使用.getDeclaredMethod.getDeclaredMethods 为给定名称查找不带参数的方法(为此使用空数组)。这些方法应该是新的“getter”,您可以在实例中调用这些方法来提取值。

【讨论】:

  • 是的,我希望我不必走反射通道 :-) 但这可能是一个选择
【解决方案3】:

请改用Cognitect aws-api :)

【讨论】:

  • 我肯定会@slipset :-) 其他人的背景:我使用的是 java aws sdk 库,升级到最新版本后,它从返回 JavaBeans 变为不返回 JavaBeans。 Cognitects lib 允许我在没有互操作的情况下使用完整的 clojure!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2019-09-26
  • 2012-03-19
相关资源
最近更新 更多