创建使用反射抽象类中的一个实例(Create an instance within Abstract

2019-07-03 23:34发布

是否有可能建立在使用反射抽象父类派生类的实例,让我们说:

abstract class Base {

public Base createInstance(){
  //using reflection
    Class<?> c = this.getClass();
    Constructor<?> ctor = c.getConstructor();
    return ((Base) ctor.newInstance());
}

}//end Base

class Derived extends Base {

 main(){

new Derived().createInstance()

 }

}

Answer 1:

你可以这样做

public class Derived extends Base {
    public static void main(String ... args) {
        System.out.println(new Derived().createInstance());
    }
}

abstract class Base {
    public Base createInstance() {
        //using reflection
        try {
            return getClass().asSubclass(Base.class).newInstance();
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

版画

Derived@55fe910c

更常见的图案是使用Cloneable的

public class Derived extends Base {
    public static void main(String ... args) throws CloneNotSupportedException {
        System.out.println(new Derived().clone());
    }
}

abstract class Base implements Cloneable {
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

版画

Derived@8071a97

然而,为使用的需要应该避免。 通常有另一种方法做你所需要的,这样的基础并不不隐式依赖于衍生。



Answer 2:

证明它的工作原理很简单:

abstract class Base {
  public Base createInstance() throws Exception {
    return getClass().newInstance();
  }
}

public class Derived extends Base {
  public static void main(String[] args) throws Exception {
    System.out.println(new Derived().createInstance().getClass());
  }
}

版画

class test.Derived

你应该问自己两次为什么需要它,以及它是否真的是你的问题的好办法。 如果你需要克隆,考虑clone机制,基本上做同样的事情。



Answer 3:

您可以使用Class.forName()Class.newInstance()创建的任何类。 但是,有没有办法可以轻松地识别类的子类。 见这JavaWorld的尖端的技术来做到这一点。

我认为,然而,真正的问题是,究竟是什么你最终要实现的,能不能用常规技术更容易实现。



文章来源: Create an instance within Abstract Class using Reflection