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

问题描述 投票:1回答:1

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

这基本上是我想要做的:

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

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

编辑:

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

java byte-buddy
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.