如何使用Bytebuddy拦截字段访问(不使用getter / setter)

user6397000:

我正在尝试使用字节预算来拦截getfieldputfield访问。我已经阅读了该站点上相当全面的文档,但是据我所知,它涵盖了向字段添加getter和setter,而不是拦截字段访问。

这基本上是我想要做的:

...
obj.prop = value;
x = obj.prop;
...

在这两种情况下,我都试图在字段访问之前/之后调用某种方法(或插入一些字节码)。我本来想用Advice它来做,但是我找不到方法以外的其他方法来拥有它。

编辑:

我正在使用Java代理来做。我有一个想法,添加一个dup复制对象引用,然后调用定义为拦截访问的静态方法(我只关心引用的对象,而不关心字段)。

拉斐尔·温特豪德(Rafael Winterhalter):

有一个新组件仍在开发中,但已经使用基本API公开了。它被调用,MemberSubstitution并允许您用另一个执行替换方法调用或字段访问。

但是,此组件确实依赖于替换执行指令的代码。字段访问是非虚拟的,因此无法创建任何会拦截虚拟访问的代理类。相反,您必须重新定义任何现有的读取或写入字段的类,例如通过使用Java代理。

至于您更具体的问题:目前,只能进行一对一替换。我还没有时间包含一种用于调整堆栈和局部变量大小的机制。此外,你也必须DUP对象向下降低堆栈上如果字段是非静态的。可以这么说,这个问题并非微不足道,但我希望有一天能提供这种功能。

目前,您可以用静态方法调用替换字段访问。可能可以通过此方法执行原始现场操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章