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

截取对bytebuddy日志的字段访问

祁凯泽
2023-03-14

我试图用bytebuddy记录字段写入。在阅读了之前的一些帖子后,我开始使用MemberSubstitution,并使用以下代码实现了一些功能:

private static Method FIELD_INTERCEPTOR = // reflective reference to interceptFieldWrite
AsmVisitorWrapper VISITOR = MemberSubstitution.relaxed()
  .field(ElementMatchers.any())
  .onWrite()
  .replaceWith(FIELD_INTERCEPTOR)
  .on(ElementMatchers.isMethod());
..
public static void interceptFieldWrite(Object object,Object value) {
   System.out.println("intercepted field write in object " + object + " , attempt to set value to " + value);
}
..

我正在努力解决的部分是如何将对其访问被拦截的字段的引用传递到interceptFieldWrite(作为字段的字符串或实例)。如果可能的话,我当然希望完全避免反思。实际上,我不想完全替换字段访问,只想在它发生之前添加一个带有一些检查的方法。bytebuddy中是否有这样的功能,或者我是否需要使用比ASM更低级的功能来实现这一点?

共有1个答案

田丰
2023-03-14

Byte Buddy提供了这个功能,但您必须编写自己的StackMani0013s才能做到这一点。MemberSub中的机制称为replace eSusChain。在这里您指定Steps,其中每个步骤都可以执行您的意图:

  • 通过MethodInvocation调用方法

在使用上述堆栈操作之前,您必须将参数加载到方法调用和字段访问中,然后通过Method odVariableAccess,其中目标元素的偏移量由偏移量表示。

在您的情况下,这需要通过以下方式读取目标实例

MethodVaribaleAccess.of(parameters.get(0)).loadFrom(offsets.get(0));
MethodVaribaleAccess.of(parameters.get(1)).loadFrom(offsets.get(1));

以及执行有问题的方法或字段写入。目标字段将作为target传递,如果只截取字段,则可以将其强制转换为FieldDescription

确保您只拦截不会传递this实例的非静态字段。

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

  • 我正在尝试使用bytebuddy拦截和访问。我已经阅读了网站上相当全面的文档,但据我所知,它涵盖了向字段添加getter和setter,而不是拦截字段访问。 以下是我想做的: 在这两种情况下,我都在尝试在字段访问之前/之后调用一些方法(或插入一些字节码)。我正在考虑使用来做到这一点,但我无法找到一种方法将其用于方法以外的东西。 编辑: 我正在使用Java代理来做这件事。我想添加一个来复制对象引用,

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

  • 本文向大家介绍MySql用DATE_FORMAT截取DateTime字段的日期值,包括了MySql用DATE_FORMAT截取DateTime字段的日期值的使用技巧和注意事项,需要的朋友参考一下 用 DATE_FORMAT 来格式化日期字段

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

  • 问题内容: 让我们 我想按日期和时间键对输出进行排序。 非常感谢你。 问题答案: 对于GNU排序: 按月份按第二列排序(这样,“三月”排在“四月”之前) 在数字模式下按第三列排序(因此,“ 9”位于“ 10”之前) 按第四列排序。 请参见手册中的更多详细信息。