微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有@AllArguments 的 ByteBuddy 方法拦截器似乎不起作用

如何解决带有@AllArguments 的 ByteBuddy 方法拦截器似乎不起作用

我正在为我的一个项目探索 ByteBuddy。我试图拦截一个带注释的方法

import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy.Default;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;

public class Fibonacci {

  public static void main(String[] args) throws illegalaccessexception,InstantiationException {
    Fibonacci fibonacci =
        new ByteBuddy()
            .subclass(Fibonacci.class)
            .method(ElementMatchers.isAnnotatedWith(PreCondition.class))
            .intercept(MethodDelegation.to(new FiboAgent()))
            .make()
            .load(Fibonacci.class.getClassLoader(),Default.WRAPPER)
            .getLoaded()
            .newInstance();
    fibonacci.printFibo(5);
  }

  @PreCondition(expression = "n > 5")
  public void printFibo(Integer i) {
    System.out.println("Here");
  }
}

FiboAgent.java:

import net.bytebuddy.asm.Advice.AllArguments;

public class FiboAgent {
  public void intercept(@AllArguments Object[] args) {
    System.out.println("Intercepted");
  }
}

我不明白为什么这不起作用。

ByteBuddy 版本:1.10.19

解决方法

不幸的是,这是一个很容易犯的错误。 AdviceMethodDelegation 之间存在差异。方法委托更强大,但在字节码级别上也更具侵入性,这使得它对通常无法添加成员的 Java 代理的吸引力较小。为了更简单地在两者之间切换,注释是对齐的,因为建议涵盖了委托功能的一个子集。如果更换:

import net.bytebuddy.asm.Advice.AllArguments;

import net.bytebuddy.implementation.bind.annotation.AllArguments;

一切都应该按预期进行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。