Tutorial da Java Reflection API com exemplo

Índice:

Anonim

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;}}
  • O exemplo a seguir mostra diferentes maneiras de criar um objeto da classe "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 {}
    1. O nome da classe é: Guru99Base
    2. Seus modificadores de acesso são: público e abstrato
    3. Ele implementou interfaces: Serializable e Cloneable
    4. 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.classClass  guru99ClassObj = 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));}} 
    1. imprime o nome da classe usando o método getName
    2. Imprima o nome da superclasse usando o método getSuperClass (). GetName ()
    3. Imprime o nome das interfaces implementadas
    4. 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:
    1. Crie o objeto de classe da classe acima, ou seja, Guru99VariableMetaData.class como abaixo:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. 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.

    1. Obtenha o nome das variáveis ​​usando o método "public String getName ()".
    2. Obtenha o tipo de dados das variáveis ​​usando o método "public Class getType ()".
    3. 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.

    4. 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Objeto de classe criado para Guru99VariableMetaData.class
      2. Obteve todos os metadados das variáveis ​​em uma matriz de campo
      3. Imprimiu todos os nomes de variáveis ​​na classe Guru99VariableMetaData.class
      4. Imprimiu todos os tipos de dados das variáveis ​​na classe Guru99VariableMetaData.class
      5. Imprimiu todos os modificadores de acesso das variáveis ​​na classe Guru99VariableMetaData.class
      6. Valores impressos de todas as variáveis ​​em Impressos todos os tipos de dados das variáveis ​​na classe Guru99VariableMetaData.class

      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:

      1. Crie o objeto de classe da classe acima, ou seja, Guru99MethodMetaData.class como abaixo:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. 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.

      3. Obtenha o nome do método usando o método getName () .
      4. Obtenha o tipo de retorno do método usando o método getReturnType () .
      5. Obtenha modificadores de acesso dos métodos usando os métodos getModifiers () e Modifiers.toString (int i) .
      6. Obtenha os tipos de parâmetro de método usando o método getParameterTypes () que retorna uma matriz de classe.
      7. Obtenha uma exceção lançada usando o método getExceptionTypes () que retorna uma matriz de classe.

      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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
      1. Objeto de classe criado para Guru99MethodMetaData.class
      2. Obteve todos os metadados de todos os métodos em uma matriz de Método
      3. Impresso todos os nomes de métodos presentes na classe Guru99MethodMetaData.class
      4. Tipos de retorno impressos dos métodos na classe Guru99MethodMetaData.class
      5. Imprimiu todos os modificadores de acesso dos métodos na classe Guru99MethodMetaData.class
      6. Tipos de parâmetros impressos dos métodos em Guru99MethodMetaData.class
      7. Exceções impressas são lançadas por métodos em Guru99MethodMetaData.class

      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("*******************************************");}}}
      1. Objeto de classe criado para Guru99Constructor.class
      2. Obteve todos os metadados de todos os construtores em uma matriz de Construtor
      3. Foram impressos todos os nomes do construtor presentes na classe Guru99Constructor.class
      4. Foram impressos todos os modificadores de acesso dos construtores na classe Guru99Constructor.class
      5. Tipos de parâmetros impressos dos construtores em Guru99Constructor.class
      6. Exceções impressas são lançadas por construtores em Guru99Constructor.class

      Resumo:

      • 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.