【问题标题】:ByteBuddy Method Interceptor With @AllArguments Doesn't Seem To Work带有@AllArguments 的 ByteBuddy 方法拦截器似乎不起作用
【发布时间】:2021-01-18 06:58:27
【问题描述】:

我正在为我的一个项目探索 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

【问题讨论】:

  • 我真的不明白为什么这么多开发人员认为最好发布一组不连贯的代码 sn-ps 没有人可以复制、编译和运行以重现问题,但是让更难找到帮助,而不是仅仅发布一个MCVE,它会立即给出答案,而不会给每个潜在的志愿者带来负担去尝试猜测真正的代码是什么样子,并尝试在实际出现之前填补拼图游戏中缺失的部分能够回答一个简单的问题。简洁而不是可重复性 - 为什么?
  • 我很抱歉。这是一段相对简单的代码(我觉得自己犯了一个愚蠢的错误),所以我并没有真正发布整个内容。我已更新问题以获得 MCVE。
  • 没有一段代码太简单而不会出错。这是人而不是愚蠢。看看您的完整课程如何让 Rafael 轻松回答您的问题? (我本来会的,但刚刚在我当前的时区醒来。)现在也很清楚,你以前的 3 个代码 sn-ps 实际上只属于 2 个类,这在这里并不重要,但很可能在其他情况下。注释的包名是重要信息。公平地说,你之前提到过它,但不是作为代码的一部分,而是在一个句子中的代码之后的某个地方,这很难注意到。
  • 在这里给别人讲问题的时候,我总是觉得有点不安,怕他们会接受。但我还是这样做了,因为我知道如果他们听从了建议,我会帮助他们自助,因为如果很容易重现问题,那么解决问题的可能性要远大于帮助者必须开始推测和做出(或多或少)有根据的猜测。 ????

标签: java byte-buddy


【解决方案1】:

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

import net.bytebuddy.asm.Advice.AllArguments;

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

一切都应该按预期工作。

【讨论】:

  • 感谢 Rafael 的回答,这是我犯的错误。看起来需要更彻底地阅读文档。
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2013-07-23
  • 2020-08-17
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多