使用Reflection在Abstract Class中创建实例

时间:2012-11-19 09:32:19

标签: java reflection abstract-class

是否可以使用反射在抽象祖先类中创建派生类的实例 让我们说:

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()

 }

}

3 个答案:

答案 0 :(得分:3)

你可以这样做

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

但是,应避免使用任何一种。通常还有另一种方法可以做你需要的事情,这样基础就不会隐含地依赖于派生。

答案 1 :(得分: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机制,它基本上做同样的事情。

答案 2 :(得分:1)

您可以使用Class.forName()Class.newInstance()创建任何课程。但是没有办法轻松识别类的子类。有关执行此操作的技巧,请参阅this JavaWorld tip

然而,我认为真正的问题是你最终想要达到的目标,并且可以使用传统技术更轻松地完成。