Tutorial da API Java Reflection com exemplo
O que é reflexão 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 classes e seus membros que incluem campos, métodos, construtores, 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 reflexão java.Methods da classe java.lang.Class é usado para reunir os metadados completos de uma determinada classe.
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 turma
- 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 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 :essa 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 coletar informações sobre um modificador de acesso específico.
Métodos usados em java.lang.Class
- String pública getName () :retorna o nome da classe.
- Classe pública getSuperclass() :retorna a referência da superclasse
- Classe pública[] getInterfaces() :Retorna um array de interfaces implementadas pela classe especificada
- Público em getModifiers (): Retorna um valor inteiro representando os modificadores da classe especificada que precisa ser passado como parâmetro para “public static String toString (int i )” método que retorna o especificador de acesso para a classe fornecida.
Como obter informações completas sobre uma turma
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() 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 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:public e abstract
- Tem interfaces implementadas:Serializable e Cloneable
- Como não estendeu nenhuma classe explicitamente, sua superclasse é:java.lang.Object
A classe abaixo obterá os metadados de Guru99Base.class e os imprimirá:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Classguru99ClassObj = 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 in the form of Class array using getInterface() method class[] guru99InterfaceList = guru99classObj.getInterfaces(); // Print the implemented interfaces using foreach loop system.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 class int guru99AccessModifier= guru99classObj.getModifiers(); // Print the access modifiers 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 o nome das interfaces implementadas
- Imprima 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á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 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 matriz de campo usando getFields() ou getDeclaredFields() métodos abaixo:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getCampos() O método retorna metadados da variável pública da classe especificada, bem como de sua superclasse.
getDeclaredFields() O método retorna 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 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.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(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
- Recebi todos os metadados das variáveis em uma matriz Field
- Impresso todos os nomes de variáveis na classe Guru99VariableMetaData.class
- Impresso todos os tipos de dados das variáveis na classe Guru99VariableMetaData.class
- Impresso todos os modificadores de acesso das variáveis na classe Guru99VariableMetaData.class
- Valores impressos de todas as variáveis em Imprimido todos os tipos de dados das variáveis na classe Guru99VariableMetaData.class
- Crie o objeto de classe da classe acima, ou seja, Guru99MethodMetaData.class conforme abaixo:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obtenha informações de método em uma matriz Method usando os métodos getMethods() e getDeclaredMethods() conforme abaixo:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods() O método retorna metadados dos métodos públicos da classe especificada, bem como de sua superclasse.
getDeclaredMethods() O método retorna metadados de todos os métodos apenas da classe especificada. - Obtenha o nome do método usando getName() método.
- Obtenha o tipo de retorno do método usando getReturnType() método.
- Obtenha modificadores de acesso dos métodos usando getModifiers() e Modifiers.toString(int i) métodos.
- Obtenha tipos de parâmetro de método usando getParameterTypes() método que retorna uma matriz de classe.
- Obter exceção lançada usando getExceptionTypes() método que retorna uma matriz de classe.
- Objeto de classe criado para Guru99MethodMetaData.class
- Recebi todos os metadados de todos os métodos em uma matriz de métodos
- Impresso todos os nomes de métodos presentes na classe Guru99MethodMetaData.class
- Tipos de retorno impressos dos métodos na classe Guru99MethodMetaData.class
- Impresso 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
- Recebi todos os metadados de todos os construtores em uma matriz Constructor
- Impresso todos os nomes do construtor presentes na classe Guru99Constructor.class
- Impresso 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 classe, como variáveis, métodos, 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 e variáveis particulares 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 problemas de permissão. Portanto, a API de reflexão deve ser tratada como o último recurso para realizar 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 na 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.class class 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 names System.out.println("Name of the method : "+method.getName()); // Print return type of the methods System.out.println("Return type of the method : "+method.getReturnType()); //Get the access modifier list and print int guru99ModifierList = method.getModifiers(); System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList)); // Get and print parameters of the methods Class[] 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 method Class[] 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.class Class guru99Class=Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { // Print all name of each constructor System.out.println("Constrcutor name : "+constructor.getName()); //Get and print access modifiers of each constructor int guru99Modifiers= constructor.getModifiers(); System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers)); // Get and print parameter types Class[] 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 constructors Class[] 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:
Java
- Classe anônima Java
- Reflexão Java
- Classe Java ObjectInputStream
- Classe Java ObjectOutputStream
- Classe e objeto C++ com exemplo
- Tutorial de classe abstrata C# com exemplo:O que é abstração?
- Método Java String charAt() com exemplo
- Java String EndsWith() Método com Exemplo
- Java BufferedReader:Como Ler Arquivo em Java com Exemplo
- Algoritmo de ordenação por inserção em Java com exemplo de programa