我正在尝试在运行时使用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);
}
}
答案 0 :(得分:0)
我不是最聪明的。
它在对象调用时调用该函数,而我从来没有在cuppy类中调用对象。
将Cuppy主函数更改为
cuppy cup = new cuppy();
cup.method1();
它达到了我的预期。
答案 1 :(得分:0)
对于调试此类问题,请始终添加AgentBuilder.Listener
,因为JVM总是抑制检测期间的错误。很高兴您发现了问题。