我正在使用Java AWS API来监控一些EC2实例,每次刷新时我都需要查询返回一堆Instance
对象(新构建的)的服务。我想扩展这些对象的功能,我想我可以维护一个MyInstance
对象的映射,它可以在每次投票时用新的Instance
来刷新。
现在我可以很容易地做到这一点,用一个简单的包装器类,持有原始的Instance
作为属性,问题是我想保持访问基本的Instance
API,因为我已经在我的代码中使用这些函数。是否有可能只替换实例化对象的超类部分?我想要的一个做作的例子:
class Instance {
protected int prop;
public Instance(int prop) {
this.prop = prop;
}
}
class MyInstance extends Instance {
protected int prop2;
public MyInstance(int prop, int prop2) {
super(prop);
this.prop2 = prop2;
}
}
MyInstance foo = new MyInstance(1, 2);
Instance foster = new Instance(3);
//what i want to do
foo.adoptedBy(foster);
//with the result that foo.prop == 3
显然,这个例子将是微不足道的转换,但在我的实际情况下,有更多的属性需要转移。Reflection
能做到吗?如果我每秒使用Reflection
执行10次这样的操作,会对性能产生什么样的影响?感谢阅读!
最好的解决方案是将你的两个想法结合起来:
- 将原始实例包装在扩展Instance类的类中。(在子类的构造函数中,您可以创建一个新的Instance对象并设置它)
- 将所有方法委托给包装实例(并添加新属性)
-
在您的foster方法中,您只需更改包装的Instance。
class Instance { private int prop; public Instance(int prop) { this.prop = prop; } public int getProp() { return prop; } } class MyInstance extends Instance { private Instance delegate; private int prop2; public MyInstance(Instance delegate, int prop2) { super(prop); this.delegate = delegate; this.prop2 = prop2; } @Override public int getProp() { return delegate.getProp(); } public int getProp2() { return prop2; } public void foster(Instance i) { delegate = i; } } MyInstance foo = new MyInstance(1, 2); Instance foster = new Instance(3); //what i want to do foo.adoptedBy(foster); //with the result that foo.getProp() == 3