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
















