Класс Constructor из пакета java.lang.reflect представляет конструктор класса. Он предоставляет функционал для получения информации о конструкторе, а также возможности для создания новых объектов.
Отмечу основные его возможности:
String getName(): возвращает имя конструктора
int getModifiers(): возвращает целое число с различными включенными и выключенными битами, которые описывают используемые модификаторы.
Object newInstance(Object... initargs): создаёт новый экземпляр класса, передавая конструктору аргументы через параметр initargs.
Class[] getParameterTypes(): возвращает массив объектов Class, которые представляют типы параметров.
Class[] getExceptionTypes(): возвращает массив объектов Class, представляющих типы исключений, генерируемых методом.
Для получения конструктора класса в виде объекта Constructor применяется ряд методов объекта Class:
Constructor[] getConstructors(): возвращает массив объектов Constructor для открытых конструкторов (с модификатором public) данного класса
Constructor[] getDeclaredConstructors(): возвращает массив объектов Constructor для всех конструкторов данного класса. Метод возвращают массив нулевой длины, если таких конструкторов нет или если объект
представляет собой примитивный тип или массив.
Constructor getConstructor(Class... parameterTypes): возвращает объект Constructor для публичного конструктора.
Параметр parameterTypes — это массив объектов Class, которые идентифицируют формальные типы параметров конструктора в порядке их объявления. Благодаря этим определениям параметров Java может выбрать нужную версию, если определено несколько конструкторов. Если подобный публичный конструктор отсутствует, то метод генерирует исключение NoSuchConstructorException
Constructor getDeclaredConstructor(String name): возвращает объект Constructor для любого конструктора класса. Параметр parameterTypes — это массив объектов Class, которые идентифицируют формальные типы параметров конструктора в порядке их объявления. Благодаря этим определениям параметров Java может выбрать нужную версию, если определено несколько конструкторов. Если подобный публичный конструктор отсутствует, то метод генерирует исключение NoSuchConstructorException
Например, возьмем следующий класс:
class Person {
private String name;
private int age;
Person(){
this("Undefined", 1);
}
Person(String name, int age){
this.name = name;
this.age = age;
}
void print(){
System.out.printf("Person. Name: %s; Age: %d\n", name, age);
}
}
Получим конструкторы этого класса:
import java.lang.reflect.*;
public class Program{
public static void main(String[] args) {
Class cl = Person.class;
Constructor[] ctors = cl.getDeclaredConstructors();
for(Constructor ctor : ctors){
System.out.println(ctor);
}
}
}
Консольный вывод:
Person() Person(java.lang.String,int)
Теперь получим один конструктор, исходя из его параметров. Параметы передаются в виде набора объектов Class, который представляют типы соответствующих параметров. Например, в случае с классом Person второй конструктор принимает два параметра
с типами String и int. Получим этот конструктор:
import java.lang.reflect.*;
public class Program{
public static void main(String[] args) {
Class cl = Person.class;
try{
Constructor ctor = cl.getDeclaredConstructor(String.class, int.class);
System.out.println(ctor); // Person(java.lang.String,int)
}
catch(Exception ex){
System.out.println(ex);
}
}
}
С помощью метода getParameterTypes() можно получить массив параметров, где каждый параметр представляет тип Class:
import java.lang.reflect.*;
public class Program{
public static void main(String[] args) {
Class cl = Person.class;
Constructor[] ctors = cl.getDeclaredConstructors();
for(Constructor ctor : ctors){
// получаем имя конструктора
String name = ctor.getName();
System.out.print(name + "(");
// получаем типы параметров
Class[] params = ctor.getParameterTypes();
for(Class p : params){
System.out.printf("%s, ", p.getName());
}
System.out.println(")");
}
}
}
Консольный вывод:
Person() Person(java.lang.String, int, )
С помощью метода Object newInstance(Object... initargs) можно создать новый объект класса:
public T newInstance(Object... initargs)
throws InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Параметры метода представляют набор объектов, которые предоставляют значения параметрам конструктора. Например, создадим объект Person:
import java.lang.reflect.*;
public class Program{
public static void main(String[] args) {
Class cl = Person.class;
try{
Constructor ctor = cl.getDeclaredConstructor(String.class, int.class);
Person person = (Person) ctor.newInstance("Sam", 23);
person.print(); // Person. Name: Sam; Age: 23
}
catch(Exception ex){
System.out.println(ex);
}
}
}
Здесь сначала получаем конструктор с двумя параметрами:
Constructor ctor = cl.getDeclaredConstructor(String.class, int.class);
А затем используем полученный конструктор, передавая в метод newInstance() параметры для него
Person person = (Person) ctor.newInstance("Sam", 23);