Java Reflection API Tutorial med eksempel
Hva er refleksjon i Java?
Java Refleksjon er prosessen med å analysere og endre alle egenskapene til en klasse under kjøring. Reflection API in Java brukes til å manipulere klassen og dens medlemmer som inkluderer felt, metoder, konstruktør, etc. under kjøring.
En fordel med refleksjon API i Java er, det kan manipulere private medlemmer av klassen også.
Java.lang.reflect-pakken gir mange klasser for å implementere refleksjonsjava. Metoder for java.lang.Class-klassen brukes til å samle fullstendig metadata for en bestemt klasse.
Klasse i java.lang.reflect-pakken
Følgende er en liste over ulike Java klasser i java.lang.package for å implementere refleksjon-
- Felt: Denne klassen brukes til å samle deklarativ informasjon som datatype, tilgangsmodifikator, navn og verdi på en variabel.
- Metode: Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, returtype, navn, parametertyper og unntakstype for en metode.
- Constructor: Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, navn og parametertyper for en konstruktør.
- endring: Denne klassen brukes til å samle informasjon om en bestemt tilgangsmodifikator.
Metoder brukt i java.lang.Class
- Offentlig streng getName (): Returnerer navnet på klassen.
- offentlig klasse getSuperclass(): Returnerer superklassereferansen
- Offentlig klasse[] getInterfaces() : Returnerer en rekke grensesnitt implementert av den angitte klassen
-
Offentlig i getModifiers (): Returnerer en heltallsverdi som representerer modifikatorene til den angitte klassen som må sendes som en parameter til "offentlig statisk streng til streng (int i )" metode som returnerer tilgangsspesifikasjonen for den gitte klassen.
Hvordan få fullstendig informasjon om en klasse
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; } }
Eksempel 1: Hvordan få metadata av klasse
Følgende eksempel viser hvordan du får metadata som: Klassenavn, superklassenavn, implementerte grensesnitt og tilgangsmodifikatorer for en klasse.
Vi vil få metadataene til klassen nedenfor kalt Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { }
- Navnet på klassen er: Guru99Base
- Dets tilgangsmodifikatorer er: offentlig og abstrakt
- Den har implementert grensesnitt: Serialiserbar og Klonbar
- Siden den ikke har utvidet noen klasse eksplisitt, er dens superklasse: java.lang.Object
Klassen nedenfor vil få metadataene til Guru99Base.class og skrive dem ut:
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)); } }
- skriv ut navnet på klassen ved å bruke getName-metoden
- Skriv ut navnet på superklassen ved å bruke getSuperClass().getName()-metoden
- Skriv ut navnet på de implementerte grensesnittene
- Skriv ut tilgangsmodifikatorene som brukes av klassen
Eksempel 2: Hvordan få metadata av variabel
Følgende eksempler viser hvordan du får metadata for variabel:
Her lager vi en klasse kalt Guru99VariableMetaData .class med noen 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"; }
-
Lag klasseobjektet til klassen ovenfor, dvs. Guru99VariableMetaData.class som nedenfor:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Få metadataene i form av feltarray ved å bruke getFields() or getDeclaredFields() metoder som nedenfor:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() metoden returnerer metadata for den offentlige variabelen fra den spesifiserte klassen så vel som fra dens superklasse.
getDeclaredFields() metoden returnerer kun metadata for alle variablene fra den angitte klassen.
- Få navnet på variablene ved å bruke "public String getName()"-metoden.
- Få datatypen til variablene ved å bruke "public Class getType()"-metoden.
-
Få verdien av variabelen ved å bruke "public xxx get (Field)"-metoden.
Her kan xxx være en byte eller kort av en hvilken som helst type verdi vi ønsker å hente.
-
Få tilgangsmodifikatorene til variablene ved å bruke metodene getModifier() og Modifier.toString(int i).
Her skriver vi en klasse for å få metadataene til variablene som finnes 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } }
- Opprettet klasseobjekt for Guru99VariableMetaData.class
- Fikk alle metadataene til variablene i en feltmatrise
- Skrive ut alle variabelnavnene i klassen Guru99VariableMetaData.class
- Skrive ut alle datatypene til variablene i klassen Guru99VariableMetaData.class
- Skrive ut alle tilgangsmodifikatorene til variablene i klassen Guru99VariableMetaData.class
- Utskrevne verdier av alle variablene i Skrive ut alle datatypene til variablene i klassen Guru99VariableMetaData.class
-
Lag klasseobjektet til klassen ovenfor, dvs. Guru99MethodMetaData.class som nedenfor:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Få metodeinformasjon i en Method-array ved å bruke 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 metodene fra den spesifiserte klassen så vel som fra dens superklasse.
getDeclaredMethods() metoden returnerer kun metadata for alle metodene fra den angitte klassen.
- Få navnet på metoden ved å bruke getName () metoden.
- Få returtypen til metoden ved hjelp av getReturnType() metoden.
- Få tilgang modifikatorer av metodene som bruker getModifiers() og Modifiers.toString(int i) metoder.
- Få metodeparametertyper ved hjelp av getParameterTypes() metode som returnerer en klassematrise.
-
Få kastet unntak ved hjelp av getExceptionTypes() metode som returnerer en klassematrise.
- Opprettet klasseobjekt for Guru99MethodMetaData.class
- Fikk alle metadataene til alle metodene i en Method-array
- Skrivet ut alle metodenavnene som finnes i klassen Guru99MethodMetaData.class
- Utskrevne returtyper av metodene i klassen Guru99MethodMetaData.class
- Har skrevet ut alle tilgangsmodifikatorene til metodene i klassen Guru99MethodMetaData.class
- Utskrevne parametertyper av metodene i Guru99MethodMetaData.class
-
Utskrevne unntak blir kastet av metoder i Guru99MethodMetaData.class
- Laget klasseobjekt for Guru99Constructor.class
- Fikk alle metadataene til alle konstruktørene i en Constructor-array
- Skrivet ut alle konstruktørnavnene som er tilstede i klassen Guru99Constructor.class
- Skrivet ut alle tilgangsmodifikatorene til konstruktørene i klassen Guru99Constructor.class
- Utskrevne parametertyper av konstruktørene i Guru99Constructor.class
- Utskrevne unntak er kastet av konstruktører i Guru99Constructor.class
- Refleksjonsprogrammering i java hjelper til med å hente og endre informasjon om klasser og klassemedlemmer som variable, metoder, konstruktører.
- Reflection API in Java kan implementeres ved å bruke klasser i java.lang.reflect-pakken og metoder for java.lang.Class-klassen.
- Noen vanlige metoder for java.lang.Class-klassen er getName (), getSuperclass (), getInterfaces (), getModifiers () osv.
- Noen ofte brukte klasser i java.lang.reflect-pakken er Field, Method, Constructor, Modifier, etc.
- Reflection API kan få tilgang til private metoder og variabler i en klasse som kan være en sikkerhetstrussel.
- Reflection API er en kraftig funksjon levert av Java, men det kommer med noen faste kostnader som tregere ytelse, sikkerhetssårbarhet og tillatelsesproblem. Derfor bør refleksjons-API behandles som siste utvei for å utføre en operasjon.
Eksempel 3: Hvordan få metadata av metode
Følgende eksempler viser hvordan du får metadata for en metode:
Her lager vi en klasse kalt Guru99MethodMetaData .class med noen 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"); } }
Trinn for å få metadata om metodene i klassen ovenfor:
Her skriver vi en klasse for å få metadataene til metodene som finnes 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } }
Eksempel 4: Hvordan få metadata fra konstruktører
Følgende eksempler viser hvordan du får metadata fra konstruktører:
Her lager vi en klasse kalt Guru99Constructor.class med forskjellige 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 å få metadataene til konstruktørene som er tilstede 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.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("*******************************************"); } } }