2

假设我有一个名为 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

3 回答 3

16

有反射

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

假设您的类有一个默认构造函数。您可以使用非默认(空)构造函数进行更高级的操作

Constructor[] constructors = myCar.getClass().getConstructors();

并选择你想要的。

通读本文以获取有关 Java 反射功能的更多详细信息。

于 2013-08-14T20:09:34.740 回答
0

通过反思。用这个:

myCar.getClass().newInstance();
于 2013-08-14T20:11:40.423 回答
0

关于您的更新/错误 - 看这里:

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[]确实是Objectjava 中的类型,但这会将某些对象的 3 元素数组更改为作为该数组的单个对象。因此,您尝试创建一个新对象,而不是使用 3 个参数,而是使用 1 个参数,因此会引发异常

解决方案:声明你的Object argasObject[] args和 all 应该工作。

于 2013-08-14T21:20:17.600 回答