gpt4 book ai didi

java - 从代理对象访问字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:57 26 4
gpt4 key购买 nike

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

被代理的实例有一个关联的InvocationHandler,这样当一个方法在代理上被调用时,invoke 方法在InvocationHandler 上被调用,然后调用被代理对象的相应方法,假设它已被延迟加载。没什么好惊讶的——它就像 Java 的 Proxy类,但允许我代理实际的类而不是接口(interface)(参见 dexmaker 的 ProxyBuilder )。

成为问题的部分是我还使用反射从持久对象和代理中检索字段值——现在我已经引入了延迟加载。这是我目前正在做的事情:

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) 不会检索代理对象的字段值。相反,它返回在类的构造函数中分配的默认值。对代理字段的访问明显没有被拦截。

我的问题是:有什么方法可以拦截通过反射对代理成员变量的访问吗?如果不是,我如何以“类似反射”的方式检索代理字段的值?

一种可能的解决方法 我正在考虑使用反射检索然后调用该字段的 getter 方法,但我想知道是否有更直接的解决方案。如果此变通方法确实有效,则将要求对象具有用于所有持久字段的 getter 方法——从 OO 设计的角度通常应遵循这一要求,但也会强制执行更多工作到框架的用户身上。

我愿意接受任何想法。

最佳答案

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

另一方面,如果您想使用直接字段访问方法。据我所知,没有简单的方法来拦截字段访问。请检查 this question 的答案.虽然问题与拦截字段修改有关,而不是阅读该领域,它可能会提供一些见解和方向。

关于java - 从代理对象访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com