当前位置: 首页 > 知识库问答 >
问题:

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

暴绪
2023-03-14

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

以下是我想做的:

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

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

编辑:

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

共有1个答案

齐嘉庆
2023-03-14

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

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

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

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

 类似资料:
  • 我一直在使用字节好友来监控应用程序的行为,我想在执行特定方法之前检查其中一个应用程序类的数组字段是否已更新。我已经阅读了字节好友留档和堆栈溢出问题,并找到了一些有用的留档,了解如何使用拦截字段访问。 然而,因为我感兴趣的领域是一个数组,中的和事件似乎无关紧要。 是否可以使用ByteBuddy跟踪数组字段的更新?

  • 如果我有课,说: ...我想使用Java代理拦截“某种方法”,所以我做了一些事情: 在截取方法中,如何使用ByteBuddy访问类Foo的“name”字段? ByteBuddy是否可以公开这个私有变量供我检查(或者修改,但对于我的用例,只读是可以的)?

  • 让我有一个这样的界面: 还有这样一个实现类: 现在我想使用bytebuddy创建一个拦截器/代理,它捕捉对setter的调用,存储更改后的值,并调用real方法。 最后,我想向拦截器/代理“询问”被调用的setter和更改的值。 我尝试了很多考虑也教程,但到目前为止,我发现没有工作的解决方案。也许有人可以帮助我。 这是拦截器: 以下是我当前的“测试”代码: 编辑:

  • 我试图用bytebuddy记录字段写入。在阅读了之前的一些帖子后,我开始使用,并使用以下代码实现了一些功能: 我正在努力解决的部分是如何将对其访问被拦截的字段的引用传递到(作为)。如果可能的话,我当然希望完全避免反思。实际上,我不想完全替换字段访问,只想在它发生之前添加一个带有一些检查的方法。bytebuddy中是否有这样的功能,或者我是否需要使用比ASM更低级的功能来实现这一点?

  • 让我们有一个简单的界面: 现在我这样创建代理: 当我执行测试时,我看到以下输出: 似乎我永远无法访问被调用方法的方法签名,如果它起源于接口,并且不是由超类实现的?! 当我调用我会看到,它也接受所有输入参数。 我错过了什么?我看了留档,但我仍然很困惑。 一般来说,我想创建,它捕获代理类中的所有方法,并处理以下情况: 执行一些操作,然后将调用传播到原始方法 做某事并返回它自己的结果,而不调用原始meh

  • 问题内容: 我正在为struts2拦截器创建一个示例。我创建了一个简单的登录页面,并使用了自定义拦截器类对输入进行加密。但是拦截器正在从as 读取输入的值。 我不明白我在做什么错。我想拦截器类已经足够了。如果您需要更多我的代码,请告诉。 struts.xml 拦截器.java文件 是我定义的一个单独的类,它自己可以正常工作。 问题答案: 如果您要访问参数,则拦截器应排在第一位 您的问题是这些参数不