Clojure `from-java` 的自定义访问器策略

Custom accessor strategy for Clojure `from-java`

有什么方法可以自定义 clojure.java.data/from-java 中使用的访问器策略吗? from-javajava.data function lib.

的一部分

我最近更新了一个第三方 Java-library,它曾经遵循 JavaBean getset 模式。然而,更新后他们从 getProperty() 变成了 property()...

我猜这个变化使 from-java 函数不适合这种情况,这并不奇怪,因为对象不再合适 JavaBeans。

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

from-java 是一个多方法,你可以覆盖它为任何你喜欢的class。没有教它备用命名约定的机制(如果有这样的机制,我想它会遇到 "every method with any name at all represents a property" 的麻烦)。因此,您必须编写 manual conversions,但至少会为您处理递归。

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

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

改用Cognitect aws-api:)