Tutorial de l'API de Java Reflection

Bloc

Tutorial de l'API de Java Reflection

Tutorial de l'API de Java Reflection

Què és Reflection a Java?

Java Reflection és el procés d'anàlisi i modificació de totes les capacitats d'una classe en temps d'execució. L'API de reflexió a Java s'utilitza per manipular la classe i els seus membres, que inclouen camps, mètodes, constructor, etc. en temps d'execució.

Un dels avantatges de l’API de reflexió a Java és que també pot manipular membres privats de la classe.

El paquet java.lang.reflect proporciona moltes classes per implementar reflexió java. Els mètodes de la classe java.lang.Class s’utilitzen per reunir les metadades completes d’una classe particular.

Classe al paquet java.lang.reflect

A continuació es mostra una llista de diverses classes de Java a java.lang.package per implementar la reflexió

Camp : Aquesta classe s'utilitza per recopilar informació declarativa com ara tipus de dades, modificador d'accés, nom i valor d'una variable.

Mètode : Aquesta classe s'utilitza per recopilar informació declarativa com ara modificador d'accés, tipus de retorn, nom, tipus de paràmetres i tipus d'excepció d'un mètode.

constructor : Aquesta classe s'utilitza per recopilar informació declarativa com ara modificadors d'accés, noms i tipus de paràmetres d'un constructor.

Per modificar : Aquesta classe s'utilitza per recopilar informació sobre un modificador d'accés en particular.

Mètodes utilitzats a java.lang.Class

Cadena pública getName () : Retorna el nom de la classe.

Public Class getSuperclass () : Retorna la referència de la super classe

Public Class [] getInterfaces () : Retorna una matriu d'interfícies implementades per la classe especificada

Públic a getModifiers (): Retorna un valor enter que representa els modificadors de la classe especificada que cal passar com a paràmetre a ' public static String toString (int i) ' mètode que retorna l'especificador d'accés per a la classe donada.

Com obtenir informació completa sobre una classe

Per obtenir informació sobre variables, mètodes i constructors d’una classe, hem de crear un objecte de la classe.

public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class 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 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)); }

L'exemple següent mostra diferents maneres de crear l'objecte de la classe 'class':

primera base de dades del framework d’entitats API API

Exemple 1: Com obtenir metadades de classe

L'exemple següent mostra com obtenir metadades com ara: nom de classe, nom de super classe, interfícies implementades i modificadors d'accés d'una classe.

Obtenirem les metadades de la classe següent anomenada Guru99Base.class:

// 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(field)); System.out.println(); system.out.println('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *') ; } }
  1. El nom de la classe és: Guru99Base
  2. Els seus modificadors d’accés són: públics i abstractes
  3. Ha implementat interfícies: serialitzables i clonables
  4. Com que no ha ampliat cap classe explícitament, la seva super classe és: java.lang.Object

A sota de la classe obtindreu les meta dades de Guru99Base.class i les imprimireu:

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'); }

}

  1. imprimeix el nom de la classe amb el mètode getName
  2. Imprimiu el nom de la super classe mitjançant el mètode getSuperClass (). GetName ()
  3. Imprimiu el nom de les interfícies implementades
  4. Imprimiu els modificadors d'accés que utilitza la classe

Exemple 2: Com obtenir metadades de variable

Els exemples següents mostren com obtenir metadades de variable:

Aquí, estem creant una classe anomenada Guru99VariableMetaData .class amb algunes variables:

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('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '); } }

Passos per obtenir les metadades sobre les variables de la classe anterior:

Creeu l'objecte de classe de la classe anterior, és a dir, Guru99VariableMetaData.class de la manera següent:

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{ }

Obteniu les metadades en forma de matriu de camps mitjançant getFields () o bé getDeclaredFields () mètodes següents:

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('*******************************************'); } }

getFields () El mètode retorna les metadades de la variable pública de la classe especificada i de la seva super classe.

getDeclaredFields () el mètode només retorna les metadades de totes les variables de la classe especificada.

  1. Obteniu el nom de les variables mitjançant el mètode public String getName ().
  2. Obteniu el tipus de dades de les variables mitjançant el mètode públic de classe getType ().
  3. Obteniu el valor de la variable mitjançant el mètode public xxx get (Field).
  4. En aquest cas, xxx podria ser un byte o un curt de qualsevol tipus de valor que vulguem obtenir.
  5. Obteniu els modificadors d'accés de les variables mitjançant els mètodes getModifier () i Modifier.toString (int i).
  6. Aquí escrivim una classe per obtenir les metadades de les variables presents a la classe Guru99VariableMetaData .class:
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; } } 

}

  1. Objecte de classe creat per a Guru99VariableMetaData.class
  2. He obtingut totes les metadades de les variables d'una matriu de camps
  3. S'han imprès tots els noms de variables de la classe Guru99VariableMetaData.class
  4. S'han imprès tots els tipus de dades de les variables de la classe Guru99VariableMetaData.class
  5. S'han imprès tots els modificadors d'accés de les variables de la classe Guru99VariableMetaData.class
  6. Valors impresos de totes les variables de Imprès tots els tipus de dades de les variables de la classe Guru99VariableMetaData.class

Exemple 3: Com obtenir metadades del mètode

  1. Els exemples següents mostren com obtenir metadades d'un mètode:
  2. Aquí, estem creant una classe anomenada Guru99MethodMetaData .class amb alguns mètodes
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { } 

}

Passos per obtenir les metadades sobre els mètodes de la classe anterior:

Creeu l'objecte de classe de la classe anterior, és a dir, Guru99MethodMetaData.class com es mostra a continuació:

import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { 
|_+_|

Obteniu informació del mètode en una matriu de mètodes mitjançant el mètode getMethods () i getDeclaredMethods () de la manera següent:

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;
}

getMethods () method retorna metadades dels mètodes públics de la classe especificada i de la seva super classe.

getDeclaredMethods () mètode retorna les metadades de tots els mètodes de la classe especificada.

Obteniu el nom del mètode amb getName () mètode.

Obteniu el tipus de retorn del mètode mitjançant getReturnType () mètode.

Obteniu modificadors d'accés als mètodes mitjançant getModifiers () i Modifiers.toString (int i) mètodes.

Obteniu tipus de paràmetres de mètode mitjançant getParameterTypes () mètode que retorna una matriu de classes.

Utilitzeu una excepció llançada getExceptionTypes () mètode que retorna una matriu de classes.

Aquí escrivim una classe per obtenir les metadades dels mètodes presents a la classe Guru99MethodMetaData.class:

 Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();  
Class guru99ClassObjVar = guru99ClassVar.getClass();

}

Objecte de classe creat per a Guru99MethodMetaData.class

gestor de servidors de bases de dades quickbooks 2016

He obtingut totes les metadades de tots els mètodes d'una matriu de mètodes

S'han imprès tots els noms de mètodes presents a la classe Guru99MethodMetaData.class

Tipus de retorn imprès dels mètodes de la classe Guru99MethodMetaData.class

S'han imprès tots els modificadors d'accés dels mètodes de la classe Guru99MethodMetaData.class

Tipus de paràmetres impresos dels mètodes de Guru99MethodMetaData.class

Les excepcions impreses es generen mitjançant mètodes a Guru99MethodMetaData.class

Exemple 4: Com obtenir metadades dels constructors

  1. Els exemples següents mostren com obtenir metadades dels constructors:
  2. Aquí, estem creant una classe anomenada Guru99Constructor.class amb diferents constructors:
Field[] guru99Field1= guru99ClassObjVar .getFields();  
Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

}

Aquí escrivim una classe per obtenir les metadades dels constructors presents a la classe Guru99Constructor.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();

|_+_|

}

  1. Objecte de classe creat per a Guru99Constructor.class
  2. S'han obtingut totes les metadades de tots els constructors d'una matriu de constructors
  3. S'han imprès tots els noms del constructor presents a la classe Guru99Constructor.class
  4. S'han imprès tots els modificadors d'accés dels constructors de la classe Guru99Constructor.class
  5. Tipus de paràmetres impresos dels constructors a Guru99Constructor.class
  6. Els constructors generen excepcions impreses a Guru99Constructor.class

Resum:

  • La programació de reflexió a Java ajuda a recuperar i modificar informació sobre classes i membres de la classe, com ara variables, mètodes i constructors.
  • L'API de reflexió a Java es pot implementar mitjançant classes del paquet java.lang.reflect i mètodes de la classe java.lang.Class.
  • Alguns dels mètodes més utilitzats de la classe java.lang.Class són getName (), getSuperclass (), getInterfaces (), getModifiers (), etc.
  • Algunes classes d’ús habitual del paquet java.lang.reflect són Field, Method, Constructor, Modifier, etc.
  • L'API Reflection pot accedir a mètodes i variables privats d'una classe que podria ser una amenaça per a la seguretat.
  • L'API de reflexió és una potent capacitat proporcionada per Java, però inclou algunes despeses generals, com ara un rendiment més lent, una vulnerabilitat de seguretat i un problema de permisos. Per tant, l’API de reflexió s’ha de tractar com l’últim recurs per realitzar una operació.


Gràcies per llegir. Si us ha agradat aquest missatge, compartiu-lo amb tots els vostres companys de programació.

Publicat originalment el guru99.com

#java #api # desenvolupament web