我正在尝试覆盖API中使用的类的方法而不扩展它。有没有办法在不重新编译源代码的情况下执行此操作?我无法扩展该类,因为它的实例是在另一个类中创建的,还有其他类需要扩展它。
示例:
import A,B,C;
public class Tester{
public static void main(String[] args){
A a = new A();
a.getB().method();
//The object I want to handle is A
//A has-a B and C
//C extends B and is used at some point inside B
//how can I override method() in B?
}
}
^我只需要解决这个问题
如果你想看看具体问题,我正在使用htmlunit API,我试图覆盖DomNode中的onAllChildrenAddedToPage()方法。 DomNode由WebClient类使用,需要在WebClient和DomNode中的某个点处转换为HtmlElement。我从WebClient获取其实例后创建了一个DomNode2(扩展了DomNode),但它给出了一个ClassCastException,因为DomNode2不能转换为HtmlElement。
答案 0 :(得分:0)
没有重新编译源代码就没有简单的方法可以做到这一点。你绝对相信你想要做的是必要的吗?如果是,请考虑使用您自己的自定义方法重新编译源代码,因为HtmlUnit是开源的。
如果您确实不想重新编译,还可以尝试使用ASM编辑该类的字节代码。这是相当困难的,而不是一个非常好的做法。
如果只需要向方法添加代码,则可以在调用方法时使用方法拦截器来运行代码。查看this question on method interceptors以获取有关如何执行此操作的详细信息。