我试图检测org.slf4j.Logger以拦截日志调用并通过Java代理存储它们。我的代码如下:
new AgentBuilder.Default()
.with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
.type(hasSuperType(nameContains("Logger")))
.transform(new AgentBuilder.Transformer.ForAdvice()
.include(Agent.class.getClassLoader())
.advice(named("info"), LogAdvice.class.getName()))
.installOn(inst);
LogAdvice具有以下方法:
@Advice.OnMethodEnter
public static void before(@Advice.This Object obj){
System.out.println(obj);
System.out.println("===========ENTERED INFO==========");
}
但是永远不会输入此方法。
我的方法可以与我尝试过的其他类(例如java.util.Map的put()方法)配合使用。有什么想法为什么在这种情况下无法使用仪器?
最佳答案
注册一个AgentBuilder.Listener来查看要检测的类。我怀疑您正在寻找的课程在注册代理之前已加载。
在这种情况下,您可以注册重新转换策略以重新转换这些类。
顺便说一句:在这里,我看不到渴望初始化的作用。我没有看到为此需要任何已检测类的初始化。