我试图检测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来查看要检测的类。我怀疑您正在寻找的课程在注册代理之前已加载。

在这种情况下,您可以注册重新转换策略以重新转换这些类。

顺便说一句:在这里,我看不到渴望初始化的作用。我没有看到为此需要任何已检测类的初始化。

10-08 09:32