Clojure `from-java` 的自定义访问器策略
Custom accessor strategy for Clojure `from-java`
有什么方法可以自定义 clojure.java.data/from-java
中使用的访问器策略吗? from-java
是 java.data
function lib.
的一部分
我最近更新了一个第三方 Java-library,它曾经遵循 JavaBean get
和 set
模式。然而,更新后他们从 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",您可以在您的实例中调用这些方法来提取值。
有什么方法可以自定义 clojure.java.data/from-java
中使用的访问器策略吗? from-java
是 java.data
function lib.
我最近更新了一个第三方 Java-library,它曾经遵循 JavaBean get
和 set
模式。然而,更新后他们从 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",您可以在您的实例中调用这些方法来提取值。