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

时间:2018-03-02 07:57:38

标签: java byte-buddy

我正在尝试使用bytebuddy来拦截getfieldputfield次访问。我已经阅读了网站上相当全面的文档,但从我可以理解的内容,它包括向字段添加getter和setter,而不是拦截字段访问。

这基本上就是我要做的事情:

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

在这两种情况下,我都试图在字段访问之前/之后调用一些方法(或插入一些字节码)。我正在考虑使用Advice来做这件事,但我无法找到方法将其用于方法以外的其他方式。

编辑:

我正在使用Java代理来完成它。 我想到了添加dup来复制对象引用,然后调用我定义的静态方法来拦截访问(我只关心被引用的对象,而不是字段)。

1 个答案:

答案 0 :(得分:1)

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

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

至于你更具体的问题:目前,只有1比1的替换可能。我还没来得及包含调整堆栈和局部变量大小的机制。此外,如果字段是非静态的,您还必须 dup 对象降低堆栈。问题并非微不足道,但我希望有一天能提供这样的功能。

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