java—在bytebuddy中使用@advice.allarguments是否可以截获没有参数的方法?

jc3wubiy  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(481)

我试图创建一个日志系统,将采取一系列的方法。我截取的一些方法有0个参数,其他的很多。我的问题是:我可以创建一个通用的 @Advice.OnMethodEnter 可以用 @Advice.AllArguments 和bytebuddy在一起?
方法如下所示:

@Advice.OnMethodEnter
public static void intercept(@Port int port, 
                             @Host String host, 
                             @Advice.Origin("#t:#m") String signature, 
                             @Advice.AllArguments Object[] arguments) 
{
    AgentHelper.log(host, port, signature, Arrays.toString(arguments));
}

注解完成后一切正常 @Advice.AllArguments 缺少,但我一放出来,所有没有参数的方法都被忽略了。
我还尝试查看是否存在使用以下命令引发的显式错误:

new AgentBuilder.Default()
    ...
    .with(AgentBuilder.Listener.StreamWriting.toSystemOut().withErrorsOnly())
    .with(AgentBuilder.InstallationListener.StreamWriting.toSystemOut())
    ...

但这没有显示任何错误。我是否必须逐个创建拦截器,或者是否有方法以我不了解的方式获得这种行为?

s8vozzvw

s8vozzvw1#

是的,这应该可以正常工作:

public class Example {
  public static void main(String[] args) {
    new AgentBuilder.Default()
      .disableClassFormatChanges()
       .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
       .type(is(Target.class))
       .transform((builder, typeDescription, classLoader, module) -> 
               builder.visit(Advice.to(Example.class).on(isMethod())))
       .installOn(ByteBuddyAgent.install());

    new Target().method();
  }

  @Advice.OnMethodEnter
  public static void intercept(@Advice.AllArguments Object[] arguments) {
    System.out.println("Intercepted: " + Arrays.asList(arguments));
  }

  public static class Target {
    public void method() { }
  }
}

这将在调用时打印一个空列表。

相关问题