Класс Constructor и cоздание объектов

Последнее обновление: 29.09.2025

Класс 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); 
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850
Morty Proxy This is a proxified and sanitized view of the page, visit original site.