如何使用 Bytebuddy 拦截字段访问(没有 getter/setter)
How to intercept field accesses (without getter/setter) using Bytebuddy
我正在尝试使用 bytebuddy 拦截 getfield
和 putfield
访问。我已经阅读了网站上相当全面的文档,但据我了解,它涵盖了向字段添加 getter 和 setter,而不是拦截字段访问。
这基本上是我正在尝试做的事情:
...
obj.prop = value;
x = obj.prop;
...
在这两种情况下,我都试图调用一些方法(或插入一些字节码)before/after 字段访问。我正在考虑使用 Advice
来做到这一点,但我无法找到一种方法将它用于方法之外的其他东西。
编辑:
我正在使用 Java 代理来执行此操作。
我想添加一个 dup
来复制对象引用,然后调用我定义的静态方法来拦截访问(我只关心被引用的对象,而不关心字段)。
有一个新组件仍在开发中,但已经公开了基本 API。它被称为 MemberSubstitution
并允许您用另一个执行替换方法调用或字段访问。
然而,该组件确实依赖于替换执行指令的代码。现场访问是 non-virtual,因此不可能创建任何会拦截虚拟访问的代理 class。相反,您必须重新定义读取或写入该字段的任何现有 class,例如通过使用 Java 代理。
至于你的更具体的问题:目前,只有一对一的替代是可能的。我还没有时间包含调整堆栈和局部变量大小的机制。此外,如果字段为 non-static,您还必须 dup 对象在堆栈的下方。这个问题可以说不是微不足道的,但我希望有一天能提供这样的功能。
不过,目前您可以使用静态方法调用替换字段访问。也许,你可以通过这个方法执行原始的字段操作。
我正在尝试使用 bytebuddy 拦截 getfield
和 putfield
访问。我已经阅读了网站上相当全面的文档,但据我了解,它涵盖了向字段添加 getter 和 setter,而不是拦截字段访问。
这基本上是我正在尝试做的事情:
...
obj.prop = value;
x = obj.prop;
...
在这两种情况下,我都试图调用一些方法(或插入一些字节码)before/after 字段访问。我正在考虑使用 Advice
来做到这一点,但我无法找到一种方法将它用于方法之外的其他东西。
编辑:
我正在使用 Java 代理来执行此操作。
我想添加一个 dup
来复制对象引用,然后调用我定义的静态方法来拦截访问(我只关心被引用的对象,而不关心字段)。
有一个新组件仍在开发中,但已经公开了基本 API。它被称为 MemberSubstitution
并允许您用另一个执行替换方法调用或字段访问。
然而,该组件确实依赖于替换执行指令的代码。现场访问是 non-virtual,因此不可能创建任何会拦截虚拟访问的代理 class。相反,您必须重新定义读取或写入该字段的任何现有 class,例如通过使用 Java 代理。
至于你的更具体的问题:目前,只有一对一的替代是可能的。我还没有时间包含调整堆栈和局部变量大小的机制。此外,如果字段为 non-static,您还必须 dup 对象在堆栈的下方。这个问题可以说不是微不足道的,但我希望有一天能提供这样的功能。
不过,目前您可以使用静态方法调用替换字段访问。也许,你可以通过这个方法执行原始的字段操作。