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

use*_*000 4 java byte-buddy

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

这基本上是我想做的事情:

...
obj.prop = value;
x = obj.prop;
...
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我试图在字段访问之前/之后调用一些方法(或插入一些字节码)。我正在考虑使用Advice它来做到这一点,但除了方法之外,我找不到其他方法来实现它。

编辑:

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

Raf*_*ter 5

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

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

至于你更具体的问题:目前,只能进行一对一的替换。我还没有时间包括调整堆栈和局部变量大小的机制。此外,如果该字段是非静态的,您还必须复制堆栈下方的对象。可以说这个问题并不小,但我希望有一天能提供这样的功能。

不过,目前您可以用静态方法调用替换字段访问。也许,您可以从此方法执行原始字段操作。