使用 byte-buddy 将方法添加到 class

Add a method to a class using byte-buddy

我正在尝试使用 Java agent.But 向 class 添加一个方法,它给出了如下错误。

java.lang.VerifyError: Local variable table overflow 


Exception Details:
  Location:com/github/shehanperera/example/Method.method1()V @3: aload_0
  Reason: Local index 0 is invalid
  Bytecode: 0x0000000: b800 532a b600 56b1            
    at com.github.shehanperera.example.Sample.main(Sample.java:13)

这是我的经纪人

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

这是我需要添加的方法。

public class AddMethod {

public static void method3() throws Exception {

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

}}

这是我真正的方法 class 我想在其中添加新方法。

public class Method {

Method() {

    System.out.println("This is constructor ");
}

public static void method1() {

    try {
        Thread.sleep(500);
        System.out.println("This is Method 1");
    } catch (InterruptedException e) {
        //Ignore
    }
}}

这是主要方法

public static void main(String[] args) {

    System.out.println("This is Sample main");

   (13) Method method = new Method();
    method.method1();

}

你能告诉我这是什么问题吗case.And这是正常的class我正在尝试添加方法。

您正在尝试从静态方法调用 non-static 方法,而 Byte Buddy 此处缺少检查。我添加了检查最新版本,但您尝试执行的操作将不起作用,但这当然不会导致验证程序错误。

要么使 method1 non-static 或 method3 静态,这将起作用。