所以我正在尝试学习在java中使用Reflaction主题(所以我认为它被称为),所以我做了一个小项目试图看看如何在没有最佳Constructor模式的情况下创建一个具有“new”的对象字。
不幸的是,它向我显示了为构造函数创建类类型数组的错误。这是我的项目:
SomeClass.java:
public class SomeClass {
public static void main(String[] args) {
ArrayList<Class> classes = new ArrayList<>();
classes.add(Integer.class);
classes.add(String.class);
classes.add(Boolean.class);
Class[] classesArray = (Class[]) classes.toArray(); //here is where it showes the error
ArrayList<Object> objects = new ArrayList<>();
objects.add(2452);
objects.add("sfhfshsf");
objects.add(true);
Object[] studentObjects = objects.toArray();
Student student = null;
try {
student = Student.class.getConstructor(classesArray).newInstance(
studentObjects);
} catch (InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException e1) {
e1.printStackTrace();
}
System.out.println(student);
}
}
Student.java:
public class Student {
int studendID = 0;
String studentName = "";
boolean isSome1 = false;
public Student() {
}
public Student(int studendID, String studentName, boolean isSome1) {
this.studendID = studendID;
this.studentName = studentName;
this.isSome1 = isSome1;
}
@Override
public String toString() {
return "Student [studendID=" + studendID + ", studentName="
+ studentName + ", isSome1=" + isSome1;
}
}
错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class;
at SomeClass.SomeClass.main(SomeClass.java:16)
如果我做错了,那么正确的方法是什么?求助。
答案 0 :(得分:3)
您收到错误,因为toArray
会返回Object
的数组。有fix for that,但有一种更简单的方法来构造Class
个对象:
Class[] classesArray = new Class[] {
Integer.TYPE, String.class, Boolean.TYPE
};
请注意.class
和Integer
使用.TYPE
代替Boolean
。这是因为您的构造函数采用原语 int
和boolean
,而不是Integer
和Boolean
。
答案 1 :(得分:2)
您可以使用varargs来简化此操作。
public static void main(String[] args) throws Exception {
Student student = Student.class
.getConstructor(Integer.class, String.class, Boolean.class)
.newInstance(2452, "sfhfshsf", true);
System.out.println(student);
}
您遇到的问题是,toArray()
只返回Object[]
而不是Class[]
,而且不能只返回一个。
你可以做的是。
Class[] classesArray = (Class[]) classes.toArray(new Class[0]);
答案 2 :(得分:0)
您的Student类没有接受Class []的构造函数,因此是例外。
你应该使用
Student student = Student.class.getConstructor().newInstance();//calling no-args constructor
or
Student student = Student.class.getConstructor(Integer.class, String.class, Boolean.class).newInstance(10, "Mark', true);