参考: 从 AspectJ 迁移到 Byte Buddy 插件时出现问题
当我按照示例操作,但按应有的方式更新它时:
package plugin;
import java.lang.reflect.Method;
import net.bytebuddy.asm.Advice;
public class TimingAdvice {
@Advice.OnMethodEnter
public static void onEnter(@Advice.This Object intercepted, @Advice.Origin Method method)
throws Throwable {
System.out.println("method: " + method);
}
}
我得到: 无法转换类 SomeAdvisedClass:[java.lang.IllegalStateException:无法映射静态方法或构造函数启动的此引用:public SomeAdvisedClass()]。
无论出于何种原因,只要我从建议中删除 Method 参数,它就会起作用:
package plugin;
import java.lang.reflect.Method;
import net.bytebuddy.asm.Advice;
public class TimingAdvice {
@Advice.OnMethodEnter
public static void onEnter(@Advice.This Object intercepted)
throws Throwable {
System.out.println("method: " + method);
}
}
我使用的是JDK21,使用的是最新版本的byte buddy。
我想传递方法,因为我想检查每个参数的注释,据我所知,我需要方法来做到这一点。
您似乎正在拦截静态方法或构造函数。在这种情况下,无法分配
@Advice.This
(进入阶段)。您可以定义一个属性来绑定 null
:@Advice.This(nullIfEmpty = true)
。