我正在尝试创建一个代理方法的代理,以便在方法之前和之后执行一些逻辑。为了做到这一点,我使用带有方法委托的 Byte Buddy。
代理人:
//Agent code before...
private static void instrument(String agentOps, Instrumentation inst) {
new AgentBuilder.Default().with(new Eager())
.ignore(ElementMatchers.nameContains("com.dvelopp.agenttest"))
.or(ElementMatchers.hasAnnotation(ElementMatchers.annotationType(ElementMatchers.nameContains("SpringBootApplication"))))
.type((ElementMatchers.any()))
.transform((builder, typeDescription, classLoader, module) -> builder.method(ElementMatchers.any())
.intercept(MethodDelegation.to(Interceptor.class)))
.installOn(inst);
}
//Agent code after...
拦截器:
public static class Interceptor {
@RuntimeType
public static Object intercept(@SuperCall Callable<?> superCall, @SuperMethod Method superMethod, @Origin Method currentMethod,
@AllArguments Object[] args, @This(optional = true) Object me) throws Exception {
//... logic
Object call = superCall.call();
//... logic
return call;
}
}
它在一个简单的控制台应用程序上运行完美。但是,当我的类路径中有一些公共库(例如简单的 Spring Boot 项目)时,它就无法按预期工作。
素胚勾勒不出你
相关分类