从代理对象访问字段

在开发Android的ORM框架时,我遇到了一个有趣的问题。 我正在使用一个名为dexmaker的库来进行字节码操作,这使我可以为持久对象创build代理来实现延迟加载。

被代理的实例有一个关联的InvocationHandler ,当代理invoke方法时, InvocationHandler invoke方法,然后调用代理对象各自的方法,假设它被延迟加载。 没有什么太意外的 – 就像Java的Proxy类一样,但是允许我代替实际的类来代替接口(参见dexmaker的ProxyBuilder )。

成为问题的部分是我也使用reflection来检索来自持久对象的字段值,现在我已经引入了延迟加载代理。 这是我目前正在做的事情:

 for (Field f : getPersistentFields(model.getClass()) { ... Object val = f.get(model); // model is either a persistent object or a proxy for one mapField(f, val, map); } 

这当然适用于常规模型实例,但对于代理实例, f.get(model)不会检索代理对象的字段值。 相反,它会返回在类的构造函数中分配的默认值。 代理领域的访问没有被明显拦截。

我的问题是这样的:有什么办法可以拦截通过reflection的代理的成员variables访问? 如果不是,我怎样才能以类似“reflection”的方式检索代理字段的值?

我想到的一个可能的解决方法是检索,然后调用字段的getter方法使用reflection,但我想知道是否有一个更直接的解决scheme。 这个解决方法,如果它真的起作用 ,将需要对象为所有持久性字段设置一个getter方法 – 一个通常应该从OOdevise的angular度来遵循的要求,但是也会把更多的工作强加给框架的用户。

我愿意接受任何想法。

Related of "从代理对象访问字段"

一个好的解决scheme是使用setter / getters而不是Field类来访问这些字段。 (我相信这不仅仅是一个解决方法)

另一方面,如果你想采用直接访问方式。 据我所知,有没有简单的方法来拦截现场访问。 请检查这个问题的答案。 尽pipe这个问题与拦截现场修改有关,而不是阅读现场,可能会提供一些见解和方向。