Рабочий пример:
import java.lang.reflect.Constructor;
public class Test {
public Test(String str) {
System.out.println(str);
}
public Test(int a, int b) {
System.out.println("Sum is " + (a + b));
}
public static void main(String[] args) throws Exception {
Constructor<Test> constructorStr = Test.class.getConstructor(String.class);
constructorStr.newInstance("Hello, world!");
Constructor<Test> constructorInts = Test.class.getConstructor(int.class, int.class);
constructorInts.newInstance(2, 3);
}
}
Обратите внимание, что метод getConstructor
фактически не принимает массив. Он определен как:
public Constructor<T> getConstructor(Class<?>... parameterTypes) {
... что означает, что он принимает переменное количество аргументов, которые должны были быть переданы так же, как и я. Передача массива также возможна, но это необязательно.
То, что вы сделали первоначально было эквивалентно:
Constructor<Test> constructor = Test.class.getConstructor(String.class.getClasses());
constructor.newInstance("Hello");
Но что делает String.class.getClasses()
возвращение? Хороший вопрос! Пройдемся отладки:
Class<?>[] classes = String.class.getClasses();
System.out.println(classes.length); // prints 0
Там в документации о getClasses()
: https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClasses. Проверьте это, и вы узнаете, почему это так.
Ради полноты. Супер-оригинально вопрос (до редактирования) содержит еще один конструктор - непараметрический одно:
import java.lang.reflect.Constructor;
public class Example1 {
public Example1() {
}
public Example1(String s) {
System.out.println("using param = " + s);
}
public static void main(String[] args) throws Exception {
Constructor<Example1> ctor = Example1.class.getConstructor(String.class.getClasses());
ctor.newInstance("test");
}
}
проблема, которая возникает здесь IllegalArgumentException
бросают. Это потому, что хотя String.class.getClasses()
возвращает пустой массив, на самом деле есть конструктор, который соответствует критериям - непараметрический конструктор! У него нет аргументов, и массив, возвращаемый String.class.getClasses()
, тоже не содержит ничего. Это означает, что конструктор успешно найден, но при попытке создать экземпляр с помощью ctor.newInstance("test")
он терпит неудачу, потому что найденный конструктор не принимает любые аргументы.
Ваш код на самом деле не вызывает никаких исключений. Он также не компилируется, поскольку вы не проверяете исключения NoSuchMethodException и SecurityException в main(). – tzima
@ TomášZíma Я не могу сказать, что он не компилирует на моей станции , , кстати, почему «-1»? – LordTitiKaka
он не компилируется из-за причины, о которой я вам говорил, - есть исключения, для которых вам нужно проверить. Пример ответа, который я написал, должен работать на вашей станции, не так ли?BTW, я не уменьшил ваш вопрос ... – tzima