从子类更改超类构造函数行为

时间:2016-05-17 13:18:50

标签: java

我目前遇到了一个我必须开发的插件的问题。主要的问题是我必须处理预先存在的类,这些类并不总是被设计为可用的。这涉及很多变通方法。

更具体地说,这是一个接近我的问题的代码示例:

public class OriginalHerd {
     private Animal baseAnimal;
     public Orignal() { this.baseAnimal = new Animal(); }
}

public class CustomHerd extends OriginalHerd {
     private Dog customAnimal;
     public Custom() { this.customAnimal = new Dog(); }
}

狗延伸动物。 现在,让我们假设我无法访问,并且无法修改OriginalHerd类。并且让我们假设它的构造函数是200行的monstrutruosity,其中只需要更改这一行来定义我的子类CustomHerd。

this.originalAnimal = new Animal();

改变:

this.originalAnimal = new Dog();

有没有办法在不使用Ctrl + C / Ctrl + V路的情况下这样做?特别是因为,由于baseAnimal没有受到保护,我必须在子类中复制几乎所有的OriginalHerd行为......

我当然希望这个问题有一个非常简单的解决方案,但我无法找到它。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以访问动物的制定者,例如:

OriginalHerd originalHerd = new OriginalHerd();
originalHerd.setAnimal(new Dog());

或者,如果动物是私人且无法进入的,您可以使用反射:

OriginalHerd originalHerd = new OriginalHerd();
try {
    Field field = OriginalHerd.class.getDeclaredField("baseAnimal");
    field.setAccessible(true);
    field.set(originalHerd, new Dog());
} catch (Exception e) {
    // ...
}

请注意,它可能在运行时因反射而失败。我喜欢做什么(当我必须使用反射时),我真的确保它被单元测试覆盖,所以它在构建时也失败了!