我正在尝试使用bytebuddy来拦截getfield
和putfield
次访问。我已经阅读了网站上相当全面的文档,但从我可以理解的内容,它包括向字段添加getter和setter,而不是拦截字段访问。
这基本上就是我要做的事情:
...
obj.prop = value;
x = obj.prop;
...
在这两种情况下,我都试图在字段访问之前/之后调用一些方法(或插入一些字节码)。我正在考虑使用Advice
来做这件事,但我无法找到方法将其用于方法以外的其他方式。
编辑:
我正在使用Java代理来完成它。
我想到了添加dup
来复制对象引用,然后调用我定义的静态方法来拦截访问(我只关心被引用的对象,而不是字段)。
答案 0 :(得分:1)
有一个新组件仍在开发中,但已经公开了基本API。它被称为MemberSubstitution
,允许您用另一个执行替换方法调用或字段访问。
然而,该组件依赖于替换执行指令的代码。字段访问是非虚拟的,因此无法创建任何拦截虚拟访问的代理类。相反,您必须重新定义读取或写入字段的任何现有类,例如使用Java代理。
至于你更具体的问题:目前,只有1比1的替换可能。我还没来得及包含调整堆栈和局部变量大小的机制。此外,如果字段是非静态的,您还必须 dup 对象降低堆栈。问题并非微不足道,但我希望有一天能提供这样的功能。
目前,您可以使用静态方法调用替换字段访问。可能,您可以使用此方法执行原始字段操作。