Hvad er refleksion i Java?
Java Reflection er processen med at analysere og ændre alle kapaciteter i en klasse ved kørsel. Reflection API i Java bruges til at manipulere klassen og dens medlemmer, som inkluderer felter, metoder, konstruktør osv. Under kørsel.
En fordel ved refleksions-API i Java er, at det også kan manipulere private medlemmer af klassen.
Pakken java.lang.reflect giver mange klasser til implementering af refleksionsjava.Metoder fra klassen java.lang.Class bruges til at samle de komplette metadata for en bestemt klasse.
I denne vejledning lærer du-
- Hvad er refleksion
- Klasse i java.lang.reflect-pakke
- Metoder anvendt i java.lang.Class
- Sådan får du fuldstændig information om en klasse
- Eksempel 1: Sådan får du metadata fra klasse
- Eksempel 2: Sådan får du metadata for variabel
- Eksempel 3: Sådan får du metadata af metoden
- Eksempel 4: Sådan får du metadata fra konstruktører
Klasse i java.lang.reflect-pakke
Følgende er en liste over forskellige Java-klasser i java.lang.package til implementering af refleksion-
- Felt : Denne klasse bruges til at indsamle deklarative oplysninger såsom datatype, adgangsmodifikator, navn og værdi på en variabel.
- Metode : Denne klasse bruges til at indsamle deklarative oplysninger såsom adgangsmodifikator, returtype, navn, parametertyper og undtagelsestype for en metode.
- Konstruktør : Denne klasse bruges til at indsamle deklarative oplysninger såsom adgangsmodifikator, navn og parametertyper for en konstruktør.
- Modifikator : Denne klasse bruges til at indsamle oplysninger om en bestemt adgangsmodifikator.
Metoder anvendt i java.lang.Class
- Public String getName () : Returnerer klassens navn.
- public Class getSuperclass () : Returnerer superklassereferencen
- Offentlig klasse [] getInterfaces () : Returnerer en matrix af grænseflader implementeret af den angivne klasse
- Offentligt i getModifiers (): Returnerer en heltalværdi, der repræsenterer modifikatorerne for den angivne klasse, der skal sendes som parameter til " offentlig statisk streng til String (int i)" -metode, som returnerer adgangsspecifikatoren for den givne klasse.
Sådan får du fuldstændig information om en klasse
For at få oplysninger om variabler, metoder og konstruktører for en klasse er vi nødt til at oprette et objekt fra klassen.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;}}
Eksempel 1: Sådan får du metadata fra klasse
Følgende eksempel viser, hvordan man får metadata som: Klassenavn, superklassenavn, implementerede grænseflader og adgangsmodifikatorer for en klasse.
Vi får metadata fra nedenstående klasse ved navn Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Klassens navn er: Guru99Base
- Adgangsmodifikatorer er: offentlige og abstrakte
- Det har implementeret grænseflader: Serializable og Cloneable
- Da det ikke har udvidet nogen klasse eksplicit, er det superklassen: 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));}}
- udskriv klassenavnet ved hjælp af getName-metoden
- Udskriv superklassens navn ved hjælp af metoden getSuperClass (). GetName ()
- Udskriv navnet på de implementerede grænseflader
- Udskriv adgangsmodifikatorer, der bruges af klassen
Eksempel 2: Sådan får du metadata for variabel
Følgende eksempler viser, hvordan man får metadata af variablen:
Her opretter vi en klasse ved navn Guru99VariableMetaData .class med nogle variabler:
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";}Trin til at få metadata om variablerne i ovenstående klasse:
- Opret klasseobjektet for ovenstående klasse, dvs. Guru99VariableMetaData.class som nedenfor:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Hent metadataene i form af feltarray ved hjælp af getFields () eller getDeclaredFields () -metoder som nedenfor:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields () -metoden returnerer metadata for den offentlige variabel fra den angivne klasse såvel som fra dens superklasse.
getDeclaredFields () -metoden returnerer kun metadata for alle variablerne fra den angivne klasse.
- Få navnet på variablerne ved hjælp af "public String getName ()" -metoden.
- Få datatypen af variablerne ved hjælp af "offentlig klasse getType ()" -metode.
- Få værdien af variablen ved hjælp af "public xxx get (Field)" -metoden.
Her kan xxx være en byte eller kort for enhver form for værdi, vi vil hente.
- Få adgangsmodifikatorer af variablerne ved hjælp af getModifier () og Modifier.toString (int i) metoder.
Her skriver vi en klasse for at få metadataene til de variabler, der findes i klassen 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Oprettet klasseobjekt til Guru99VariableMetaData.class
- Fik alle metadata for variablerne i et feltarray
- Trykt alle variabelnavne i klassen Guru99VariableMetaData.class
- Trykt alle datatyper af variablerne i klassen Guru99VariableMetaData.class
- Trykt alle adgangsmodifikatorer for variablerne i klassen Guru99VariableMetaData.class
- Udskrevne værdier for alle variabler i Trykt alle datatyper af variabler i klassen Guru99VariableMetaData.class
- Opret klasseobjektet for ovenstående klasse, dvs. Guru99MethodMetaData.class som nedenfor:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Få metodeoplysninger i et metodearray ved hjælp af getMethods () og getDeclaredMethods () -metoden som nedenfor:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods () -metoden returnerer metadata for de offentlige metoder fra den angivne klasse såvel som fra dens superklasse.
getDeclaredMethods () -metoden returnerer kun metadata for alle metoderne fra den angivne klasse.
- Få navnet på metoden ved hjælp af getName () -metoden.
- Få returtypen af metoden ved hjælp af getReturnType () -metoden.
- Få adgangsmodifikatorer af metoderne ved hjælp af getModifiers () og Modifiers.toString (int i) -metoderne.
- Hent metodeparametertyper ved hjælp af getParameterTypes () -metoden, der returnerer et klassearray .
- Få kastet undtagelse ved hjælp af getExceptionTypes () -metoden, der returnerer en klassearray .
- Oprettet klasseobjekt til Guru99MethodMetaData.class
- Fik alle metadata for alle metoderne i et metodearray
- Trykt alle metodenavne til stede i klassen Guru99MethodMetaData.class
- Trykte returtyper af metoderne i klassen Guru99MethodMetaData.class
- Trykt alle adgangsmodifikatorer for metoderne i klassen Guru99MethodMetaData.class
- Udskrevne parametertyper af metoderne i Guru99MethodMetaData.class
- Udskrevne undtagelser kastes efter metoder i Guru99MethodMetaData.class
- Oprettet klasseobjekt til Guru99Constructor.class
- Fik alle metadata for alle konstruktørerne i et konstruktørarray
- Trykt alle konstruktørens navne til stede i klassen Guru99Constructor.class
- Trykt alle adgangsmodifikatorer for konstruktørerne i klassen Guru99Constructor.class
- Udskrevne parametertyper af konstruktørerne i Guru99Constructor.class
- Udskrevne undtagelser kastes af konstruktører i Guru99Constructor.class
- Reflektionsprogrammering i java hjælper med at hente og ændre oplysninger om klasser og klassemedlemmer, såsom variable, metoder, konstruktører.
- Reflection API i Java kan implementeres ved hjælp af klasser i java.lang.reflect-pakken og metoder til java.lang.Class-klassen.
- Nogle almindeligt anvendte metoder til java.lang.Class-klassen er getName (), getSuperclass (), getInterfaces (), getModifiers () osv.
- Nogle almindeligt anvendte klasser i java.lang.reflect-pakken er felt, metode, konstruktør, modifikator osv.
- Reflection API har adgang til private metoder og variabler i en klasse, der kan være en sikkerhedstrussel.
- Reflection API er en stærk funktion leveret af Java, men den kommer med nogle omkostninger som langsommere ydelse, sikkerhedssårbarhed og tilladelsesproblemer. Derfor skal refleksions-API behandles som den sidste udvej til at udføre en operation.
Eksempel 3: Sådan får du metadata af metoden
Følgende eksempler viser, hvordan man får metadata til en metode:
Her opretter vi en klasse ved navn Guru99MethodMetaData .class med nogle metoder
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");}}
Trin til at få metadata om metoderne i ovenstående klasse:
Her skriver vi en klasse for at få metadataene til metoderne til stede i klassen 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Eksempel 4: Sådan får du metadata fra konstruktører
Følgende eksempler viser, hvordan man får metadata fra konstruktører:
Her opretter vi en klasse ved navn Guru99Constructor.class med forskellige konstruktører:
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{ }}
Her skriver vi en klasse for at få metadataene fra konstruktørerne til stede i klassen 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("*******************************************");}}}
Resumé: