可以使用父类的新实例刷新的Java子类

时间:2014-08-13 22:11:04

标签: java inheritance reflection amazon-ec2

我正在使用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个,我会看到什么样的性能影响?谢谢你的阅读!

1 个答案:

答案 0 :(得分:0)

最好的解决方案是结合您的想法:

  1. 将原始实例包装在扩展Instance类的类中。 (在子类的构造函数中,您可以创建一个新的Instance对象并进行设置)
  2. 将所有方法委托给包装实例(并添加新属性)
  3. 在您的福斯特方法中,您只需更改包装的实例。

    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