O que é o Reflection em Java?
Java Reflection é o processo de análise e modificação de todos os recursos de uma classe em tempo de execução. A API de reflexão em Java é usada para manipular a classe e seus membros, que incluem campos, métodos, construtor, etc. em tempo de execução.
Uma vantagem da API de reflexão em Java é que ela também pode manipular membros privados da classe.
O pacote java.lang.reflect fornece muitas classes para implementar a reflexão java.Methods da classe java.lang.Class é usado para reunir os metadados completos de uma classe específica.
Neste tutorial, você aprenderá-
- O que é reflexão
- Classe no pacote java.lang.reflect
- Métodos usados em java.lang.Class
- Como obter informações completas sobre uma aula
- Exemplo 1: como obter metadados de classe
- Exemplo 2: como obter metadados de variável
- Exemplo 3: Como obter metadados do método
- Exemplo 4: Como obter metadados de construtores
Classe no pacote java.lang.reflect
A seguir está uma lista de várias classes Java em java.lang.package para implementar a reflexão
- Campo : esta classe é usada para reunir informações declarativas, como tipo de dados, modificador de acesso, nome e valor de uma variável.
- Método : esta classe é usada para coletar informações declarativas, como modificador de acesso, tipo de retorno, nome, tipos de parâmetro e tipo de exceção de um método.
- Construtor : esta classe é usada para coletar informações declarativas, como modificador de acesso, nome e tipos de parâmetro de um construtor.
- Modificador : esta classe é usada para reunir 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 in getModifiers (): Retorna um valor inteiro que representa os modificadores da classe especificada que precisa ser passado como um parâmetro para o método " public static String toString (int i)" que retorna o especificador de acesso para a classe dada.
Como obter informações completas sobre uma aula
Para obter informações sobre variáveis, métodos e construtores de uma classe, precisamos criar um objeto da classe.public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
Exemplo 1: como obter metadados de classe
O exemplo a seguir mostra como obter metadados como: nome da classe, nome da superclasse, interfaces implementadas e modificadores de acesso de uma classe.
Obteremos os metadados da classe abaixo chamada 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 abstrato
- Ele implementou interfaces: Serializable e Cloneable
- Como não estendeu nenhuma classe explicitamente, sua superclasse é: java.lang.Object
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName());// Get the list of implemented interfaces in the form of Class array using getInterface() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.out.print("Implemented interfaces are : ");for (Class guru99class1 : quru99 InterfaceList) {system.out.print guru99class1.getName() + " ");}system.out.println();//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));}}
- imprime o nome da classe usando o método getName
- Imprima o nome da superclasse usando o método getSuperClass (). GetName ()
- Imprime o nome das interfaces implementadas
- Imprime os modificadores de acesso usados pela classe
Exemplo 2: como obter metadados de variável
Os exemplos a seguir mostram como obter metadados de variáveis:
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 na classe acima:
- Crie o objeto de classe da classe acima, ou seja, Guru99VariableMetaData.class como abaixo:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obtenha os metadados na forma de array de campo usando os métodos getFields () ou getDeclaredFields () conforme abaixo:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
O método getFields () retorna metadados da variável pública da classe especificada, bem como de sua superclasse.
O método getDeclaredFields () retorna metadados de todas as variáveis somente 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 ou abreviação de qualquer tipo de valor que desejamos buscar.
- Obtenha os modificadores de acesso das variáveis usando os métodos getModifier () 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;public class Guru99VariableMetaDataTest {public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {// Create Class object for Guru99VariableMetaData.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(Field field : guru99Field1) {System.out.println("Variable name : "+field.getName());System.out.println("Datatypes of the variable :"+field.getType());int guru99AccessModifiers = field.getModifiers();System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));System.out.println("Value of the variable : "+field.get(guru99ClassVar));System.out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Objeto de classe criado para Guru99VariableMetaData.class
- Obteve todos os metadados das variáveis em uma matriz de campo
- Imprimiu todos os nomes de variáveis na classe Guru99VariableMetaData.class
- Imprimiu todos os tipos de dados das variáveis na classe Guru99VariableMetaData.class
- Imprimiu todos os modificadores de acesso das variáveis na classe Guru99VariableMetaData.class
- Valores impressos de todas as variáveis em Impressos todos os tipos de dados das variáveis na classe Guru99VariableMetaData.class
- Crie o objeto de classe da classe acima, ou seja, Guru99MethodMetaData.class como abaixo:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obtenha informações de método em uma matriz de método usando os métodos getMethods () e getDeclaredMethods () conforme abaixo:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
O método getMethods () retorna metadados dos métodos públicos da classe especificada, bem como de sua superclasse.
O método getDeclaredMethods () retorna metadados de todos os métodos apenas da classe especificada.
- Obtenha o nome do método usando o método getName () .
- Obtenha o tipo de retorno do método usando o método getReturnType () .
- Obtenha modificadores de acesso dos métodos usando os métodos getModifiers () e Modifiers.toString (int i) .
- Obtenha os tipos de parâmetro de método usando o método getParameterTypes () que retorna uma matriz de classe.
- Obtenha uma exceção lançada usando o método getExceptionTypes () que retorna uma matriz de classe.
- Objeto de classe criado para Guru99MethodMetaData.class
- Obteve todos os metadados de todos os métodos em uma matriz de Método
- Impresso todos os nomes de métodos presentes na classe Guru99MethodMetaData.class
- Tipos de retorno impressos dos métodos na classe Guru99MethodMetaData.class
- Imprimiu todos os modificadores de acesso dos métodos na classe Guru99MethodMetaData.class
- Tipos de parâmetros impressos dos métodos em Guru99MethodMetaData.class
- Exceções impressas são lançadas por métodos em Guru99MethodMetaData.class
- Objeto de classe criado para Guru99Constructor.class
- Obteve todos os metadados de todos os construtores em uma matriz de Construtor
- Foram impressos todos os nomes do construtor presentes na classe Guru99Constructor.class
- Foram impressos todos os modificadores de acesso dos construtores na classe Guru99Constructor.class
- Tipos de parâmetros impressos dos construtores em Guru99Constructor.class
- Exceções impressas são lançadas por construtores em Guru99Constructor.class
- A programação de reflexão em java ajuda a recuperar e modificar informações sobre classes e membros de classes, tais como variáveis, métodos e construtores.
- A API de reflexão em Java pode ser implementada usando classes no pacote java.lang.reflect e métodos da classe java.lang.Class.
- Alguns métodos comumente usados da classe java.lang.Class são getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
- Algumas classes comumente usadas no pacote java.lang.reflect são Field, Method, Constructor, Modifier, etc.
- A API de reflexão pode acessar métodos privados e variáveis de uma classe que pode ser uma ameaça à segurança.
- A API de reflexão é um recurso poderoso fornecido pelo Java, mas vem com algumas sobrecargas, como desempenho mais lento, vulnerabilidade de segurança e problema de permissão. Portanto, a API de reflexão deve ser tratada como o último recurso para executar uma operação.
Exemplo 3: Como obter metadados do método
Os exemplos a seguir mostram como obter 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 Reflextion 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");}}
Etapas para obter os metadados sobre os métodos da classe acima:
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 Guru99Method MetaData.classclass guru99ClassObj = Guru99MethodMetaData.class;// Get the metadata or information of all the methods of the class using getDeclaredMethods()Method[] guru99Methods=guru99classObj.getDeclaredMethods();for(Method method : guru99Methods) {// Print the method namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] guru99ParamList= method.getParameterTypes();system.out.print ("Method parameter types : ");for (Class class1 : guru99ParamList){System.out.println(class1.getName()+" ");}System.out.println();// Get and print exception thrown by the methodClass[] guru99ExceptionList = method. getExceptionTypes();system.out.print("Excpetion thrown by method :");for (Class class1 : guru99ExceptionList) {System.out.println (class1.getName() +" "):}System.Out.println();system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Exemplo 4: Como obter metadados de construtores
Os exemplos a seguir mostram como obter metadados de 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;public class Guru99ConstructorMetaDataTest {public static void main (String[] args) {// Create Class object for Guru99Constructor.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] guru99ParamList=constructor.getParameterTypes();System.out.print ("Constrctor parameter types :");for (Class class1 : guru99ParamList) {System.out.println(class1.getName() +" ");}System. out.println();// Get and print exception thrown by constructorsClass[] guru99ExceptionList=constructor.getFxceptionTypes();System.out.println("Exception thrown by constructors :");for (Class class1 : guru99ExceptionList) {System.out.println(class1.getName() +" ");}System.out.println();System.out.println("*******************************************");}}}
Resumo: