在java中使用没有“new”字的构造函数

时间:2016-01-03 14:30:03

标签: java reflection

所以我正在尝试学习在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)

如果我做错了,那么正确的方法是什么?求助。

3 个答案:

答案 0 :(得分:3)

您收到错误,因为toArray会返回Object的数组。有fix for that,但有一种更简单的方法来构造Class个对象:

Class[] classesArray = new Class[] {
    Integer.TYPE, String.class, Boolean.TYPE
};

请注意.classInteger使用.TYPE代替Boolean。这是因为您的构造函数采用原语 intboolean,而不是IntegerBoolean

答案 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);