我用Bytebuddy添加的方法没有被调用,但是没有错误

时间:2019-06-09 22:03:59

标签: java byte-buddy

我正在尝试在运行时使用Bytebuddy将方法添加到现有类中,但没有收到任何错误,但没有得到预期的输出。这是我的经纪人:

public class Agent {

    public static void premain(String arguments, Instrumentation instrumentation) {

        System.out.println("Agent for add a method ");

        new AgentBuilder.Default()
                .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
                .type((ElementMatchers.nameContains("cup")))
                .transform((builder, typeDescription, classLoader, module) -> builder
                        .defineMethod("method3", void.class, Visibility.PUBLIC)
                        .intercept(MethodDelegation.to(AddMethod.class))
                        .method(ElementMatchers.any())
                        .intercept(SuperMethodCall.INSTANCE
                                .andThen(MethodCall.invoke(ElementMatchers.nameContains("method3"))))
                ).installOn(instrumentation);

    }
}

预期输出应为以下函数:

    public static void method3() throws Exception {

       System.out.println("This is method 3");

    }

运行时命令行的输出仅为

Agent for add a method
hello world

这是我要检测的Java文件。

public class cuppy {
    public static void main (String args [])
    {
         method1();
    }

    public static void method1 ()
    {
        System.out.println("hello world);
    }
}

2 个答案:

答案 0 :(得分:0)

我不是最聪明的。

它在对象调用时调用该函数,而我从来没有在cuppy类中调用对象。

将Cuppy主函数更改为

 cuppy cup = new cuppy();
         cup.method1();

它达到了我的预期。

答案 1 :(得分:0)

对于调试此类问题,请始终添加AgentBuilder.Listener,因为JVM总是抑制检测期间的错误。很高兴您发现了问题。