使用byte-buddy向类添加方法

时间:2018-03-23 11:32:54

标签: java byte-buddy

我正在尝试使用Java代理向类添加方法。但是它给出了如下错误。

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");

}}

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

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();

}

你可以告诉我这个案例中的问题是什么。这是我试图添加方法的正常类。

1 个答案:

答案 0 :(得分:1)

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

使List<Article> articles = null; var wpLoadTask = Task.Run(async () => { articles = await _cmsClient.GetAllArticlesAsync(); }); wpLoadTask.Wait(); 非静态或method1静态,这将有效。