gpt4 book ai didi

java - 使用 byte-buddy 向类添加方法

转载 作者:行者123 更新时间:2023-12-02 11:28:34 24 4
gpt4 key购买 nike

我正在尝试使用 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");

}}

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

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

}

你能给我任何想法在这种情况下有什么问题吗?这是一个普通的类,我正在尝试添加方法。

最佳答案

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

method1 设为非静态或将 method3 设为静态即可。

关于java - 使用 byte-buddy 向类添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com