Java JAR方法覆盖

时间:2019-03-13 07:08:13

标签: java

所以我是Java的新手,真的很想在这里提出一些建议。

我有一个jar XYZ.jar,它已添加到我的类路径中。 XYZ.jar有大约4个类,即A,B,C,DCLASS D中有一种方法称为private void METHOD P(),正在由CLASSES A,B,C调用。

现在我的Main.java中有一个类project,它具有方法METHOD R().

现在,我想用private void METHOD P()中存在的METHOD R()覆盖Main.java。我可以做的一件事是,可以用C Main class扩展LASS D。但是,然后我将不得不修改CLASSES A,B,C中的方法名,因为这些类在jar中,所以我不想这样做。

因此,我想知道的是,是否有一种方法覆盖罐子中存在的类的私有方法,而无需进行任何更改其余的调用该方法的类都位于jar中

2 个答案:

答案 0 :(得分:1)

假设您的类ABC期望类D作为其构造参数:

class Main extends D {
    public static void Main(String[] args) {
        Main main = new Main();
        A a = new A(main);
        B b = new B(main);
        C c = new C(main);
    }

    public void R() { ... }

    public void P() {
        R();
    }
}

但这仅在D及其方法P()不是最终的,并且您的其他类未实例化D的情况下有效。

另一种但昂贵的方法是使用PowerMockito模拟方法D.P()以使用Main.R()。但这不应该用于生产代码

答案 1 :(得分:1)

如果要覆盖Main类中的D类方法,则需要做两件事:

  1. 确保您的Main extends D。如果Main不继承D,则无法覆盖其方法
  2. 确保Main类中的方法与要覆盖的方法具有完全相同的签名。

因此,不要在Main类中使用名为R的方法,而应将其重命名为称为P的方法(因为这是您要覆盖的方法)。 为了避免出错,建议添加@Override。这将显示您是否出错。

现在,如果确实需要将其称为R(因为此方法已被您自己代码中的其他方法/类调用,则可以按照Lino的建议进行操作:

public void R(/* parameters */) {
  P(/* parameters */);
}

@Override
public void P(/* parameters */ ) {
  // the overriden code
}

这模仿R来覆盖P,但是R的签名或其中的代码的任何更改都将与此矛盾。

编辑: 或者,一种更好的方法:

public void R(/* parameters */) {
  // the overriden code
}

@Override
public void P(/* parameters */ ) {
  R(/* parameters */);
}