【问题标题】:Is it possible to intercept a method that has no arguments with using @Advice.AllArguments in ByteBuddy?在 ByteBuddy 中使用 @Advice.AllArguments 是否可以拦截没有参数的方法?
【发布时间】:2020-12-03 14:25:04
【问题描述】:

我正在尝试创建一个将采用一系列方法的日志记录系统。我正在拦截的一些方法有 0 个参数,其他的有很多。我的问题是:我可以创建一个通用的@Advice.OnMethodEnter,它可以使用@Advice.AllArgumentsByteBuddy 来捕获参数吗?

方法如下:

@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())
    ...

但这并没有显示任何错误。我是否必须逐个创建拦截器,还是有办法以我不理解的方式获取此行为?

【问题讨论】:

    标签: java byte-buddy javaagents


    【解决方案1】:

    是的,这应该没有问题:

    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() { }
      }
    }
    

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

    【讨论】:

    • 您好,感谢您的回答,经过调查,发现是典型的键盘椅接口问题。在某些时候,我使用了拦截而不是访问,尽管我不确定为什么它的行为如此不同,它解决了这个问题。我将不得不运行一些测试,看看这个错误是如何映射到我观察到的效果的。再次感谢!
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多