Метод, который я добавляю с помощью Bytebuddy, не вызывается, но ошибок нет - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь добавить метод к существующему классу во время выполнения с 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 голосов
/ 10 июня 2019

Что касается отладки таких проблем, всегда добавляйте AgentBuilder.Listener, поскольку ошибки во время контрольно-измерительных приборов всегда подавляются JVM. Рад, что вы поняли свою проблему.

0 голосов
/ 10 июня 2019

Я не самый яркий.

Она вызывает функцию при вызове объекта, и я никогда не вызывал объект в своем классе cuppy.

Как только я изменил основную функцию cuppy на

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

, он сделал то, что ожидал.

...