是否可以使用反射在抽象祖先类中创建派生类的实例 让我们说:
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()
}
}
答案 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。
然而,我认为真正的问题是你最终想要达到的目标,并且可以使用传统技术更轻松地完成。