覆盖没有扩展的方法(java)

时间:2014-02-21 00:56:37

标签: java override 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 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。

1 个答案:

答案 0 :(得分:0)

没有重新编译源代码就没有简单的方法可以做到这一点。你绝对相信你想要做的是必要的吗?如果是,请考虑使用您自己的自定义方法重新编译源代码,因为HtmlUnit是开源的。

如果您确实不想重新编译,还可以尝试使用ASM编辑该类的字节代码。这是相当困难的,而不是一个非常好的做法。

如果只需要向方法添加代码,则可以在调用方法时使用方法拦截器来运行代码。查看this question on method interceptors以获取有关如何执行此操作的详细信息。