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

Java 如何使用Bytebuddy拦截字段访问(没有getter/setter),java,byte-buddy,Java,Byte Buddy,我正在尝试使用bytebuddy拦截getfield和putfield访问。我已经阅读了网站上相当全面的文档,但据我所知,它涵盖了向字段添加getter和setter,而不是拦截字段访问 以下是我想做的: ... obj.prop = value; x = obj.prop; ... 在这两种情况下,我都试图在字段访问之前/之后调用一些方法(或插入一些字节码)。我曾想用建议来做这件事,但除了方法之外,我找不到其他方法 编辑: 我正在使用Java代理来做这件事。 我想添加一个dup来复制对象引用

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

以下是我想做的:

...
obj.prop = value;
x = obj.prop;
...
在这两种情况下,我都试图在字段访问之前/之后调用一些方法(或插入一些字节码)。我曾想用
建议
来做这件事,但除了方法之外,我找不到其他方法

编辑:

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

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

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

至于你更具体的问题:目前,只有一对一的替代可能。我还没有时间包括调整堆栈和局部变量大小的机制。此外,如果字段是非静态的,则还必须将对象复制到堆栈的较低位置。可以说,这个问题并不微不足道,但我希望有一天能提供这样的功能


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

谢谢!我确实在使用java代理来转换类,现在我已经编辑了这个问题以包含这些信息。我认为使用
AsmVisitorWrapper
是完全可能的,但我想知道是否可以用bytebuddy的API来代替。我扩展了我的答案。