【发布时间】:2017-09-23 22:42:42
【问题描述】:
我有一个如下所示的课程
public class HelloWorld{
public void sayHelloWorld(){
System.out.println("Hello World");
}
}
现在我想使用 bytebuddy 向 HelloWorld 类添加另一个方法,并在 sayHelloWorld 中添加对新方法的调用。所以假设在 bytebuddy 做了魔法之后,这个类看起来像这样。 (我知道 bytebuddy 使用字节码而不是 java 源文件。下面的代码仅用于说明目的。)
public class HelloWorld{
public void sayHelloWorld(){
System.out.println("Hello World");
sayHelloAgain()
}
public void sayHelloAgain(){
System.out.println("Hello Again")
}
}
- 首先,bytebuddy 可以做到这一点吗?
- 其次,如果可以的话,我该怎么做?我已经明白 bytebuddy 可以用来重新定义方法,但不能修改方法体。这是真的吗?
如果有人能对此有所了解,那就太好了。蒂亚!
【问题讨论】:
-
1) 你需要他们所谓的变基 (bytebuddy.net/javadoc/1.7.5/net/bytebuddy/…) 2) 查看他们的教程 (bytebuddy.net/#/tutorial),“重新定义和变基现有类”部分说您使用与子类化相同的语法 (他们详细讨论),除了前面提到的 .rebase 方法的起点。但是,修改现有方法似乎是不可能的,我认为这只是修改现有类。但是可以替换,但是您必须重新构建完整的方法
-
谢谢。但是替换整个方法体对我来说不是一个选择,因为我只能访问字节码并且操作字节码非常困难,我希望有一种更清洁、更简单的方法来修改方法。
标签: java byte-buddy