我目前遇到了一个我必须开发的插件的问题。主要的问题是我必须处理预先存在的类,这些类并不总是被设计为可用的。这涉及很多变通方法。
更具体地说,这是一个接近我的问题的代码示例:
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行为......
我当然希望这个问题有一个非常简单的解决方案,但我无法找到它。
非常感谢
答案 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) {
// ...
}
请注意,它可能在运行时因反射而失败。我喜欢做什么(当我必须使用反射时),我真的确保它被单元测试覆盖,所以它在构建时也失败了!