所以我是Java的新手,真的很想在这里提出一些建议。
我有一个jar XYZ.jar
,它已添加到我的类路径中。 XYZ.jar
有大约4个类,即A,B,C,D
。 CLASS 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中。
答案 0 :(得分:1)
假设您的类A
,B
和C
期望类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类方法,则需要做两件事:
Main extends D
。如果Main不继承D,则无法覆盖其方法因此,不要在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 */);
}