带有 @AllArguments 的 ByteBuddy 方法拦截器似乎不起作用
ByteBuddy Method Interceptor With @AllArguments Doesn't Seem To Work
我正在为我的一个项目探索 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");
}
}
我不明白为什么这不起作用。
字节好友版本:1.10.19
不幸的是,这是一个简单的错误。 Advice 和 MethodDelegation 是有区别的。方法委托更强大,但在字节代码级别上也更具侵入性,这使得它对 Java 代理的吸引力降低,因为代理通常无法添加成员。为了更简单地在两者之间切换,注释是对齐的,因为建议覆盖了委托功能的一个子集。如果替换:
import net.bytebuddy.asm.Advice.AllArguments;
和
import net.bytebuddy.implementation.bind.annotation.AllArguments;
一切都应该按预期工作。
我正在为我的一个项目探索 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");
}
}
我不明白为什么这不起作用。
字节好友版本:1.10.19
不幸的是,这是一个简单的错误。 Advice 和 MethodDelegation 是有区别的。方法委托更强大,但在字节代码级别上也更具侵入性,这使得它对 Java 代理的吸引力降低,因为代理通常无法添加成员。为了更简单地在两者之间切换,注释是对齐的,因为建议覆盖了委托功能的一个子集。如果替换:
import net.bytebuddy.asm.Advice.AllArguments;
和
import net.bytebuddy.implementation.bind.annotation.AllArguments;
一切都应该按预期工作。