如何在运行时创建与另一个类型相同的对象?

时间:2021-01-24 17:22:01

标签: java

我有一个接受 MyObject 接口作为参数的方法。在这个方法中,我想创建一个相同运行时实现类的对象。像这样

public void myMethod(MyObject myObject) {
    MyObject localObject = new ...??//instantiate a concrete MyObject like the parameter myObject.
    doSomething(localObject);
}

public void doSomething(MyObject myObject){//do something with this object}

我在 MyObject 上没有任何类型的 clone() 实现,也没有原型设计。

也许我在做一些完全不是 Java 的事情?

2 个答案:

答案 0 :(得分:2)

选项 1:复制方法

如果 MyObject 是一个(可能是抽象的)类/接口,你可以创建一个复制方法:

public interface MyObject{
    MyObject newOfSameType();
}
public abstract class MyObject{
    public abstract MyObject newOfSameType();
}

然后实现可以覆盖 copy() 方法:

public class MyConcreteObject implements MyObject{
    @Override
    public MyConcreteObject newOfSameType(){
        MyConcreteObject copy=new MyConcreteObject();
        //You could do setup stuff, here
    }
}
}

选项 2:反思

另一种方法是使用反射来创建相同类型的对象:

MyObject localObject;//set it to something
Class<? extends MyObject> cl=localObject.getClass();
Constructor<? extends MyObject> constructor=cl.getConstructor();//expect no-args-constructor
//Constructor<? extends MyObject> constructor=cl.getConstructor(cl);//expect copy constructor
//Constructor<? extends MyObject> constructor=cl.getConstructor(Parameter.class);//expect a constructor with a parameter of a class called Parameter, varargs work, here
MyObject instance=constructor.newInstance();
//MyObject instance=constructor.newInstance(instance);//copy constructor
//MyObject instance=constructor.newInstance(yourParameter);//parameter of type Parameter, varargs work here

答案 1 :(得分:0)

  1. 您可以根据运行时的具体实现来创建对象。 如果您有 2 个具体的实现,MyObject1 和 MyObject2,请使用以下内容:

     public static MyObject copyObject(MyObject myObject) {
         if (myObject == null) return null;
         if (myObject instanceof MyObject1) {
              return new MyObject1();
         }
         if (myObject instanceof MyObject2) {
              return new MyObject2();
         }
         return null;
     }
    
  2. 反思。

相关问题