假设我有一个名为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)由于某种原因不起作用,它表示“错误的参数数量”。知道为什么吗?
答案 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
,并且一切正常。