Java 如果第三方库类中的method()调用super.method,如何重写它?

Java 如果第三方库类中的method()调用super.method,如何重写它?,java,overriding,super,Java,Overriding,Super,我本想调用super.super.method(),但在java中不能这样做。 这里有几个问题和很多答案,比如 但在这种情况下,没有一个能起作用。 这不是“糟糕的设计”或破坏封装的问题。我有一个真实的用例,我需要重写第三方类,因为它有一个bug,我正在寻找一个好的解决方案 因此,我正在寻求解决方案的情况是: 类ContextGetter和SpecialContextGetter位于第三部分类库中。 SpecialContextGetter中的getContext方法有一个bug(它将i设置为8而

我本想调用super.super.method(),但在java中不能这样做。 这里有几个问题和很多答案,比如 但在这种情况下,没有一个能起作用。
这不是“糟糕的设计”或破坏封装的问题。我有一个真实的用例,我需要重写第三方类,因为它有一个bug,我正在寻找一个好的解决方案

因此,我正在寻求解决方案的情况是:
类ContextGetter和SpecialContextGetter位于第三部分类库中。 SpecialContextGetter中的getContext方法有一个bug(它将i设置为8而不是7)

我想把它修好。 因此,我用SpecialContextGetterCorrected扩展了SpecialContextGetter,并在其中重新实现了getContext(从SpecialContextGetter复制并进行了更改) 并指示框架使用我的类SpecialContextGetterCorrected,而不是 特约通讯员

问题是我的新方法仍然需要调用ContextGetter.getContext 我不能让Java这么做。(我想调用super.super.getContext)

如果不将自己的com.thirdparty.SpecialContextGetter放在类路径前面,我该如何完成这一任务

package com.thirdparty;
class ContextGetter {
    //has several state variables  
    public Context getContext(Set x) throws Exception { 
        /* uses the state vars and its virtual methods */
        /* may return a Context or throw an Exception */
    } 
    /* other methods, some overridden in SpecialContextGetter */
}
class SpecialContextGetter {
    //has several state variables  
    public Context getContext(Set x) throws Exception { 
        /* uses the state vars and its virtual methods */
        /* somewhere in it it contains this: */

        if (isSomeCondition()) {
            try {
                // *** in my copied code i want to call super.super.getContext(x) ***
                Context ctxt=super.getContext(x); 
                /* return a modified ctxt or perhaps even a subclass of Context */
            } catch( Exception e) {
                /* throws new exceptions as well as rethrows some exceptions
                   depending on e and other state variables */
            }
        else {
            /* some code */
            int i=8; // *** this is the bug. it should set i to 7  ***
            /* may return a Context or throw an Exception */
        }
    } 
    /* other methods, some overridden in SpecialContextGetter */
}

我看到了两个选项,如果第三方软件的可见性声明太紧,这两个选项都可能不可行

  • 与其扩展
    SpecialContextGetter
    并覆盖罪魁祸首方法,不如复制/粘贴整个
    SpecialContextGetter
    类并修复其中的错误。这可能很难看,这是唯一的出路
  • 不要扩展
    SpecialContextGetter
    ,而是扩展
    ContextGetter
    并委托给
    SpecialContextGetter
    的一个实例(您将在这个新类的构造函数中收到该实例),用于所有方法,除了您希望修复bug的方法,在该方法中可以访问所需的
    super
    。如果幸运的话,您可以这样做,但我感觉一些可见性声明或可变状态不允许您这样做

我看到了两个选项,如果第三方软件的可见性声明太紧,这两个选项可能都不可行

  • 与其扩展
    SpecialContextGetter
    并覆盖罪魁祸首方法,不如复制/粘贴整个
    SpecialContextGetter
    类并修复其中的错误。这可能很难看,这是唯一的出路
  • 不要扩展
    SpecialContextGetter
    ,而是扩展
    ContextGetter
    并委托给
    SpecialContextGetter
    的一个实例(您将在这个新类的构造函数中收到该实例),用于所有方法,除了您希望修复bug的方法,在该方法中可以访问所需的
    super
    。如果幸运的话,您可以这样做,但我感觉一些可见性声明或可变状态不允许您这样做

那么为什么不将基类代码也复制到已更正的类中,这样就不必再调用super了?或者你可以修复坏掉的类并重建jar?那么为什么不把基类代码也复制到你修改过的类中,这样你就不需要再调用super了?或者您可以修复损坏的类并重建jar?反射可以用来规避可见性甚至一些可变性(最终)问题。@Durandal是的,您是对的。当我在Java中遇到问题时,反射是我最不愿意考虑的事情。我假设你的第一点是做我所说的“将我自己的com.thirdparty.SpecialContextGetter放在类路径前面”。。。如果没有,请解释。至于第二点,1)它需要控制哪些参数传递给SpecialContextGetter(及其子类)的构造函数,2)这意味着在我的类中,我需要实现整个层次结构的所有方法(当然,这是简单的实现)3)我需要扩展SpecialContextGetter,因为框架中的某些方法可能需要它,而不是它的父对象4)我需要使用反射从委托获取数据,在任何一种情况下,都要考虑将代码与新的第三方版本合并会有多困难release@inor公平点。在这一点上,我只是分叉库,修复bug,发布我自己的特殊版本并使用它。在这一点上,您还可以向上游提供修复,以便在将来摆脱分叉。这基本上就是Durandal所建议的。反射可以用来规避可见性甚至一些可变性(最终)问题。@Durandal是的,你是对的。当我在Java中遇到问题时,反射是我最不愿意考虑的事情。我假设你的第一点是做我所说的“将我自己的com.thirdparty.SpecialContextGetter放在类路径前面”。。。如果没有,请解释。至于第二点,1)它需要控制哪些参数传递给SpecialContextGetter(及其子类)的构造函数,2)这意味着在我的类中,我需要实现整个层次结构的所有方法(当然,这是简单的实现)3)我需要扩展SpecialContextGetter,因为框架中的某些方法可能需要它,而不是它的父对象4)我需要使用反射从委托获取数据,在任何一种情况下,都要考虑将代码与新的第三方版本合并会有多困难release@inor公平点。在这一点上,我只是分叉库,修复bug,发布我自己的特殊版本并使用它。在这一点上,您还可以向上游提供修复,以便在将来摆脱分叉。这基本上就是杜兰达尔的建议。