Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射在抽象类中创建实例_Java_Reflection_Abstract Class - Fatal编程技术网

Java 使用反射在抽象类中创建实例

Java 使用反射在抽象类中创建实例,java,reflection,abstract-class,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

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

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

 }
抽象类基类{
公共基createInstance(){
//使用反射
c类=this.getClass();
Constructor=c.getConstructor();
return((Base)ctor.newInstance());
}
}//端基
类派生的扩展基{
main(){
新建派生().createInstance()
}

}

您可以使用
Class.forName()
Class.newInstance()
创建任何类。但是没有办法轻易地识别类的子类。有关执行此操作的技术,请参见

然而,我认为真正的问题是你最终想要实现的目标是什么,使用传统的技术能更容易地实现吗

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
Derived@8071a97
class test.Derived
更常见的模式是使用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@55fe910c
Derived@8071a97
class test.Derived

但是,应避免使用任何一种。通常,有另一种方法可以满足您的需要,这样base就不会隐式地依赖于派生项。

证明它有效很容易:

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());
  }
}
印刷品

Derived@55fe910c
Derived@8071a97
class test.Derived

你应该两次问自己为什么需要它,以及它是否真的是解决问题的好方法。如果需要克隆,请考虑<代码>克隆> /Cord>机制,它基本上是相同的。看起来会有用的。你试的时候发生了什么?您可以这样做,但这是一个相当可疑的设计选择。@PeterLawrey它可以被证明是一个复制方法。请注意,您正在浪费代码行:
public Base createInstance(){return(Base)getClass().newInstance();}
是您所需要的全部(模块异常)。嗯。这段代码一开始甚至不会编译。不管怎样,当您尝试它时发生了什么?>我正在尝试编写一个API(cover Base abstract class)。我需要这个基类的deepCopy方法。无论如何,深度复制在一般情况下是无法解决的。您需要仔细考虑每个类的自定义代码。这就是为什么通过泛化实例创建代码获得的收益很少。