【发布时间】: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