Trabalhando com Construtores usando a Classe Constructor em Java
A classe Constructor
, do pacote java.lang.reflect
, representa os construtores de uma classe.
Ela fornece meios para inspecionar as definições de construtores e também para criar instâncias de forma dinâmica.
Principais métodos:
String getName()
: retorna o nome do construtor.int getModifiers()
: retorna um valor inteiro cujos bits indicam os modificadores aplicados.Object newInstance(Object... initargs)
: cria um novo objeto chamando o construtor, recebendo os argumentos no parâmetroinitargs
.Class[] getParameterTypes()
: retorna um array de objetosClass
que representa os tipos dos parâmetros do construtor.Class[] getExceptionTypes()
: retorna um array de objetosClass
que representa os tipos das exceções que o construtor pode lançar.
Obtendo Construtores
A classe Class
fornece métodos para acessar os construtores:
Constructor[] getConstructors()
: retorna um array com todos os construtores públicos da classe.Constructor[] getDeclaredConstructors()
: retorna um array com todos os construtores, independentemente do modificador de acesso.Constructor getConstructor(Class... parameterTypes)
: retorna um construtor público específico de acordo com os tipos de parâmetros informados. Se não houver um construtor compatível, lançaNoSuchMethodException
.Constructor getDeclaredConstructor(Class... parameterTypes)
: retorna um construtor específico, mesmo que não seja público. Se não existir, lançaNoSuchMethodException
.
Exemplo de Classe
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);
}
}
Obtendo Todos os Construtores
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);
}
}
}
Saída:
Person() Person(java.lang.String,int)
Obtendo um Construtor Específico
Para buscar um construtor que tenha parâmetros, é necessário indicar os tipos dos parâmetros na ordem correta.
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);
}
}
}
Obtendo os Parâmetros do Construtor
O método getParameterTypes()
retorna um array de Class
que representa os tipos dos parâmetros.
Isso permite inspecionar a assinatura de cada construtor.
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(")");
}
}
}
Saída:
Person() Person(java.lang.String, int, )
Criando Objetos com newInstance
O método newInstance(Object... initargs)
cria uma nova instância chamando o construtor correspondente.
Os argumentos fornecidos devem coincidir em número e tipo com os parâmetros do construtor selecionado.
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);
}
}
}
Neste exemplo, primeiro é obtido o construtor que recebe dois parâmetros:
Constructor<?> ctor = cl.getDeclaredConstructor(String.class, int.class);
Em seguida, o método newInstance()
é chamado com os valores que serão passados para esse construtor:
Person person = (Person) ctor.newInstance("Sam", 23);
Resumo
- A classe
Constructor
permite acessar e inspecionar os construtores de uma classe. - Os métodos
getConstructors()
egetDeclaredConstructors()
listam os construtores públicos ou todos os definidos na classe. - Os métodos
getConstructor()
egetDeclaredConstructor()
recuperam um construtor específico de acordo com os tipos de parâmetros. - O método
getParameterTypes()
fornece a lista de tipos dos parâmetros de um construtor. - O método
newInstance()
possibilita a criação dinâmica de objetos com base no construtor selecionado.