无扩展重写方法(java)

无扩展重写方法(java),java,overriding,htmlunit,extending,Java,Overriding,Htmlunit,Extending,我试图重写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 hand

我试图重写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中。我制作了一个DomNode2,它在从WebClient获取DomNode实例后扩展了DomNode,但它给出了一个ClassCastException,因为DomNode2不能转换到HtmlElement中。

如果不重新编译源代码,很难做到这一点。你绝对确定你要做的是必要的吗?如果是,请考虑用自己的自定义方法重新编译源代码,因为HtmlUnit是开源的。 如果确实不想重新编译,也可以尝试使用编辑类的字节码。这是相当困难的,但不是一个真正的好做法


如果只需要向方法添加代码,则可以在调用方法时使用方法拦截器来运行代码。查看有关如何执行此操作的更多信息。

我不明白为什么扩展DomNode和重写onAllChildrenAddedToPage会导致ClassCastException。但是看看HtmlUnitAPI,HtmlElement扩展了DomNode。因此,您的DomNode2可以扩展HtmleElement并覆盖onAllChildrenAddedToPage。这将解决您的ClassCastException问题,因为有人试图将您的对象强制转换为HtmleElement。我只是尝试扩展HtmlParagraph不是HtmleElement,这给了我错误,我的错误,但出于某种原因,它仍然给了ClassCastException错误。我给了DomNode2一个名为super的构造函数,并将它们放在同一个包中。真奇怪。主线程java.lang.ClassCastException中的异常:com.gargoylesoftware.htmlunit.html.HtmlParagraph无法转换为com.gargoylesoftware.htmlunit.html.domnode2我可以问一下,在更大的范围内,您想要实现什么?可能还会发布一些代码。是的,我必须重写该方法,因为我要做的是在DomNode内部递归调用,递归与我希望父节点调用子节点的方式相反,因此子节点首先得到处理。ASM看起来太难了,如果不起作用,我将尝试使用方法拦截器并编辑源代码。谢谢不过,如果其他人有任何其他解决方案,我很想听听