创建对象类的新实例

时间:2013-08-14 20:08:04

标签: java

假设我有一个名为myCar的对象,它是Car的一个实例。

myCar = new Car();

如何根据对象创建该类的新实例?假设我不知道myCar是从哪个类创建的。

otherObject = new myCar.getClass()(); // Just do demonstrate what I mean (I know this doesn't work)

更新

public class MyClass {
    public MyClass(int x, int y, Team team) { }
    public MyClass() { }
}

Object arg = new Object[] {2, 2, Game.team[0]};

try {
    Constructor ctor = assignedObject.getClass().getDeclaredConstructor(int.class, int.class, Team.class);
    ctor.setAccessible(true);
    GameObject obj = (GameObject) ctor.newInstance(arg);

} catch (InstantiationException x) {
    x.printStackTrace();
} catch (IllegalAccessException x) {
    x.printStackTrace();
} catch (InvocationTargetException x) {
    x.printStackTrace();
} catch (NoSuchMethodException x) {
    x.printStackTrace();
}

我收到以下错误:

java.lang.IllegalArgumentException: wrong number of arguments

getDeclaredConstructor()工作并找到具有三个args的构造函数,但newInstance(arg)由于某种原因不起作用,它表示“错误的参数数量”。知道为什么吗?

4 个答案:

答案 0 :(得分:15)

带反射

otherObject = myCar.getClass().newInstance();

假设您的类具有默认构造函数。您可以使用非默认(空)构造函数

执行更多高级操作
Constructor[] constructors = myCar.getClass().getConstructors();

选择你想要的那个。

阅读this,了解有关Java反射功能的更多详细信息。

答案 1 :(得分:0)

您只需在类对象上调用newInstance(

Car newCar=myCar.getClass().newInstance();

您需要一个默认构造函数,并且还必须记住任何异常都包含在InvocationTargetException中。

如果该类没有默认构造函数,则在没有非反射工厂或构造函数的情况下,这是不可能的。

  

InstantiationException - 如果此Class表示抽象类,接口,数组类,基元类型或void; 或者如果类没有空构造函数

答案 2 :(得分:0)

通过反思。使用此:

myCar.getClass().newInstance();

答案 3 :(得分:0)

关于你的UPDATE /错误 - 请看这里:

public class DupaReflect {

    private String name;
    private int id;

    private DupaReflect(String name, int id) {
        super();
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return "DupaReflect [name=" + name + ", id=" + id + "]";
    }

    public static void main(String[] args) throws Exception {
        Object[] objects = new Object[] { "asd", 1 };
        DupaReflect dupa = DupaReflect.class.getDeclaredConstructor(String.class, int.class).newInstance(objects);
        System.out.println(dupa);
    }

}

这可以工作并产生所需的输出。 DupaReflect [name=asd, id=1]

Object[] objects = new Object[]{"asd", 1}; - 这就是为什么我的代码有效,而你的代码没有。

在您的代码中,您有:

Object arg = new Object[] {2, 2, Game.team[0]};

Object[]确实是java中Object的类型,但是这会将某些对象的3元素数组更改为该数组的单个对象。因此,您尝试创建一个不带3个参数的新对象,但使用1,因此抛出异常

解决方案:将您的Object arg声明为Object[] args,并且一切正常。