Java Tutorial da API Reflection com exemplo
โก Resumo Inteligente
Java A API de Reflexรฃo analisa e modifica as capacidades de uma classe em tempo de execuรงรฃo, incluindo seus campos, mรฉtodos e construtores. Este recurso explica o pacote java.lang.reflect, os principais mรฉtodos de java.lang.Class e quatro exemplos que leem os metadados de uma classe, variรกvel, mรฉtodo e construtor.

O que รฉ reflexรฃo Java?
Java A reflexรฃo รฉ o processo de analisar e modificar todas as capacidades de uma classe em tempo de execuรงรฃo. A API de Reflexรฃo em Java ร utilizado para manipular uma classe e seus membros, incluindo campos, mรฉtodos, construtores, etc., em tempo de execuรงรฃo.
Uma das vantagens da API de Reflexรฃo รฉ Java ร que tambรฉm pode manipular os membros privados da classe.
O pacote java.lang.reflect fornece vรกrias classes para implementar reflexรฃo. Os mรฉtodos da classe java.lang.Class sรฃo usados โโpara coletar os metadados completos de uma classe especรญfica.
Classe no pacote java.lang.reflect
Segue uma lista de vรกrio Java aulas No pacote java.lang.reflect para implementar reflexรฃo:
- Campo: Essa classe รฉ usada para reunir informaรงรตes declarativas, como o tipo de dados, o modificador de acesso, o nome e o valor de uma variรกvel.
- Mรฉtodo: Essa classe รฉ usada para reunir informaรงรตes declarativas, como o modificador de acesso, o tipo de retorno, o nome, os tipos de parรขmetros e o tipo de exceรงรฃo de um mรฉtodo.
- Construtor: Esta classe รฉ usada para reunir informaรงรตes declarativas, como o modificador de acesso, o nome e os tipos de parรขmetros de um construtor.
- Editar: Esta classe รฉ usada para coletar informaรงรตes sobre um modificador de acesso especรญfico.
Mรฉtodos usados โโem java.lang.Class
- public String getName(): Retorna o nome da classe.
- public Class getSuperclass(): Retorna a referรชncia da superclasse.
- public Class[] getInterfaces(): Retorna uma matriz de interfaces implementadas pela classe especificada.
- public int getModifiers(): Retorna um valor inteiro representando os modificadores da classe especificada, que precisa ser passado como parรขmetro para o mรฉtodo โpublic static String toString(int i)โ que retorna o especificador de acesso para a classe fornecida.
Como obter informaรงรตes completas sobre uma aula
Para obter informaรงรตes sobre variรกveisPara acessar os mรฉtodos e construtores de uma classe, precisamos criar um objeto dessa classe. O exemplo a seguir mostra diferentes maneiras de criar um objeto da classe "Classe":
public class Guru99ClassObjectCreation { public static void main(String[] args) throws ClassNotFoundException { // 1 - By using Class.forName() method Class c1 = Class.forName("Guru99ClassObjectCreation"); // 2 - By using getClass() method Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); // 3 - By using .class Class c3 = Guru99ClassObjectCreation.class; } }
Exemplo 1: Como obter os metadados de uma classe
O exemplo a seguir mostra como obter metadados como o nome da classe, o nome da superclasse, as interfaces implementadas e os modificadores de acesso de uma classe.
Obteremos os metadados da classe abaixo, com o nome especificado. Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- O nome da classe รฉ: Guru99Base
- Seus modificadores de acesso sรฃo: pรบblico e absoluto.tract
- Possui interfaces implementadas: Serializable e Cloneable
- Como nรฃo estende explicitamente nenhuma classe, sua superclasse รฉ: java.lang.Object
A classe abaixo obterรก os metadados de Guru99Base.class e imprima-o:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> guru99ClassObj = Guru99Base.class; // Print name of the class System.out.println("Name of the class is : " + guru99ClassObj.getName()); // Print super class name System.out.println("Name of the super class is : " + guru99ClassObj.getSuperclass().getName()); // Get the list of implemented interfaces using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- Imprima o nome da classe usando o mรฉtodo getName().
- Imprima o nome da superclasse usando o mรฉtodo getSuperclass().getName().
- Imprima os nomes das interfaces implementadas.
- Imprima os modificadores de acesso usados โโpela classe.
Exemplo 2: Como obter os metadados de uma variรกvel
O exemplo a seguir mostra como obter os metadados de uma variรกvel.
Aqui, estamos criando uma classe chamada Guru99VariableMetaData.class com algumas variรกveis:
package guru; public class Guru99VariableMetaData { public static int guru99IntVar1 = 1111; static int guru99IntVar2 = 2222; static String guru99StringVar1 = "guru99.com"; static String guru99StringVar2 = "Learning Reflection API"; }
Etapas para obter os metadados sobre as variรกveis โโda classe acima:
- Crie o objeto da classe acima, ou seja, Guru99VariableMetaData.class, como abaixo:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obtenha os metadados na forma de uma matriz de campos usando o getFields() or getDeclaredFields () mรฉtodos como abaixo:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
O getFields() O mรฉtodo retorna os metadados das variรกveis โโpรบblicas da classe especificada, bem como de sua superclasse.
O getDeclaredFields () O mรฉtodo retorna os metadados de todas as variรกveis โโapenas da classe especificada.
- Obtenha o nome das variรกveis โโusando o mรฉtodo โpublic String getName()โ.
- Obtenha o tipo de dados das variรกveis โโusando o mรฉtodo โpublic Class getType()โ.
- Obtenha o valor da variรกvel usando o mรฉtodo โpublic xxx get(Field)โ. Aqui, xxx pode ser um byte, um short ou qualquer tipo de valor que vocรช queira obter.
- Obtenha os modificadores de acesso das variรกveis โโusando os mรฉtodos getModifiers() e Modifier.toString(int i).
Aqui, estamos escrevendo uma classe para obter os metadados das variรกveis โโpresentes na classe. Guru99VariableMetaData.class:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- Criou-se um objeto de classe para Guru99VariableMetaData.class.
- Obtive todos os metadados das variรกveis โโem uma matriz de campos.
- Imprimiu todos os nomes de variรกveis โโda classe. Guru99VariableMetaData.class.
- Imprimiu todos os tipos de dados das variรกveis โโda classe.
- Imprimiu todos os modificadores de acesso das variรกveis โโda classe.
- Imprimiu os valores de todas as variรกveis โโda classe.
Exemplo 3: Como obter os metadados de um mรฉtodo
O exemplo a seguir mostra como obter os metadados de um mรฉtodo.
Aqui, estamos criando uma classe chamada Guru99MethodMetaData.class com alguns mรฉtodos:
package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException { System.out.println("Demo method for Reflection API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException { System.out.println("Demo method for Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException { System.out.println("Demo method for Reflection API"); } }
Passos para obter os metadados sobre os mรฉtodos na classe acima:
- Crie o objeto da classe acima, ou seja, Guru99MethodMetaData.class, conforme abaixo:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obtenha informaรงรตes sobre os mรฉtodos em um array de mรฉtodos usando os mรฉtodos getMethods() e getDeclaredMethods(), conforme abaixo:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
O getMethods() O mรฉtodo retorna os metadados dos mรฉtodos pรบblicos da classe especificada, bem como de sua superclasse. getDeclaredMethods() O mรฉtodo retorna os metadados de todos os mรฉtodos da classe especificada.
- Obtenha o nome do mรฉtodo usando o getName () mรฉtodo.
- Obtenha o tipo de retorno do mรฉtodo usando o getReturnType() mรฉtodo.
- Obtenha os modificadores de acesso dos mรฉtodos usando o getModifiers() e Modificador.toString(int i) mรฉtodos.
- Obtenha os tipos de parรขmetros do mรฉtodo usando o getParameterTypes() mรฉtodo, que retorna um array de classes.
- Obtenha exceรงรตes lanรงadas usando o getExceptionTypes() mรฉtodo, que retorna um array de classes.
Aqui, estamos escrevendo uma classe para obter os metadados dos mรฉtodos presentes na classe. Guru99MethodMetaData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Criou-se um objeto de classe para Guru99MethodMetaData.class.
- Obtive todos os metadados de todos os mรฉtodos em uma matriz de mรฉtodos.
- Imprimiu todos os nomes de mรฉtodos presentes na classe.
- Imprimiu os tipos de retorno dos mรฉtodos da classe.
- Imprimiu todos os modificadores de acesso dos mรฉtodos da classe.
- Imprimiu os tipos de parรขmetros dos mรฉtodos.
- Imprimiu as exceรงรตes lanรงadas pelos mรฉtodos.
Exemplo 4: Como obter metadados de construtores
O exemplo a seguir mostra como obter os metadados dos construtores.
Aqui, estamos criando uma classe chamada Guru99Constructor.class com diferentes construtores:
package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException, ArithmeticException { } public Guru99Constructor(int no, String name) throws RemoteException, SQLException { } public Guru99Constructor(int no, String name, String address) throws InterruptedException { } }
Aqui, estamos escrevendo uma classe para obter os metadados dos construtores presentes na classe. Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class Guru99ConstructorMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99Constructor.class Class guru99Class = Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Criou-se um objeto de classe para Guru99Construtor.classe.
- Obtive todos os metadados de todos os construtores em um array de construtores.
- Imprimiu todos os nomes dos construtores presentes na classe.
- Imprimiu todos os modificadores de acesso dos construtores da classe.
- Imprimiu os tipos de parรขmetros dos construtores.
- Imprimiu as exceรงรตes lanรงadas pelos construtores.
















