使用 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
静态,这将起作用。
我正在尝试使用 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
静态,这将起作用。