Java Reflection API Tutorial med exempel
Vad รคr reflektion i Java?
Java Reflektion รคr processen att analysera och modifiera alla funktioner i en klass vid kรถrning. Reflection API in Java anvรคnds fรถr att manipulera klass och dess medlemmar som inkluderar fรคlt, metoder, konstruktorer, etc. vid kรถrning.
En fรถrdel med reflektions-API i Java รคr att det kan manipulera privata medlemmar i klassen ocksรฅ.
Paketet java.lang.reflect tillhandahรฅller mรฅnga klasser fรถr att implementera reflektionsjava. Metoder fรถr klassen java.lang.Class anvรคnds fรถr att samla in fullstรคndig metadata fรถr en viss klass.
Klass i java.lang.reflect-paketet
Fรถljande รคr en lista รถver olika Java klasser i java.lang.package fรถr att implementera reflektion-
- Fรคlt: Denna klass anvรคnds fรถr att samla in deklarativ information som datatyp, รฅtkomstmodifierare, namn och vรคrde pรฅ en variabel.
- Metod: Denna klass anvรคnds fรถr att samla in deklarativ information sรฅsom รฅtkomstmodifierare, returtyp, namn, parametertyper och undantagstyp fรถr en metod.
- Konstruktรถr: Denna klass anvรคnds fรถr att samla in deklarativ information sรฅsom รฅtkomstmodifierare, namn och parametertyper fรถr en konstruktor.
- byta: Denna klass anvรคnds fรถr att samla information om en viss รฅtkomstmodifierare.
Metoder som anvรคnds i java.lang.Class
- Public String getName (): Returnerar namnet pรฅ klassen.
- public Class getSuperclass(): Returnerar superklassreferensen
- Public Class[] getInterfaces() : Returnerar en uppsรคttning grรคnssnitt implementerade av den angivna klassen
-
Offentlig i getModifiers (): Returnerar ett heltalsvรคrde som representerar modifierarna fรถr den angivna klassen som mรฅste skickas som en parameter till "public static String toString (int i )" metod som returnerar รฅtkomstspecifikationen fรถr den givna klassen.
Hur man fรฅr fullstรคndig information om en klass
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;
}
}
Exempel 1: Hur man fรฅr metadata av klass
Fรถljande exempel visar hur man fรฅr metadata som: Klassnamn, superklassnamn, implementerade grรคnssnitt och รฅtkomstmodifierare fรถr en klass.
Vi kommer att fรฅ metadata frรฅn nedanstรฅende klass som heter Guru99Base.class:
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- Klassens namn รคr: Guru99Base
- Dess รฅtkomstmodifierare รคr: offentliga och abstrakta
- Den har implementerat grรคnssnitt: Serialiserbar och Klonbar
- Eftersom den inte har utรถkat nรฅgon klass explicit, รคr dens superklass: java.lang.Object
Nedan klass kommer att fรฅ metadata fรถr Guru99Base.class och skriva ut den:
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 namnet pรฅ klassen med metoden getName
- Skriv ut namnet pรฅ superklassen med metoden getSuperClass().getName().
- Skriv ut namnet pรฅ de implementerade grรคnssnitten
- Skriv ut de รฅtkomstmodifierare som anvรคnds av klassen
Exempel 2: Hur man fรฅr metadata av variabel
Fรถljande exempel visar hur man fรฅr metadata fรถr variabel:
Hรคr skapar vi en klass som heter Guru99VariableMetaData .class med nรฅgra 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";
}
-
Skapa klassobjektet fรถr ovanstรฅende klass, dvs Guru99VariableMetaData.class enligt nedan:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Fรฅ metadata i form av field array med hjรคlp av getFields() or getDeclaredFields() metoder enligt nedan:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() metod returnerar metadata fรถr den publika variabeln frรฅn den angivna klassen sรฅvรคl som frรฅn dess superklass.
getDeclaredFields() metod returnerar endast metadata fรถr alla variabler frรฅn den angivna klassen.
- Hรคmta namnet pรฅ variablerna med metoden "public String getName()".
- Hรคmta datatypen fรถr variablerna med metoden "public Class getType()".
-
Fรฅ vรคrdet pรฅ variabeln med metoden "public xxx get (Field)".
Hรคr kan xxx vara en byte eller kort av nรฅgon typ av vรคrde vi vill hรคmta.
-
Hรคmta รฅtkomstmodifierarna fรถr variablerna med metoderna getModifier() och Modifier.toString(int i).
Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr variablerna som finns 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } - Skapat klassobjekt fรถr Guru99VariableMetaData.class
- Fick all metadata fรถr variablerna i en Field-array
- Skrev ut alla variabelnamn i klassen Guru99VariableMetaData.class
- Skriver ut alla datatyper fรถr variablerna i klassen Guru99VariableMetaData.class
- Skriver ut alla รฅtkomstmodifierare fรถr variablerna i klassen Guru99VariableMetaData.class
- Utskrivna vรคrden fรถr alla variabler i Utskrivna alla datatyper fรถr variablerna i klassen Guru99VariableMetaData.class
-
Skapa klassobjektet fรถr ovanstรฅende klass, dvs Guru99MethodMetaData.class enligt nedan:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Hรคmta metodinformation i en metodmatris med metoderna getMethods() och getDeclaredMethods() enligt nedan:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods() metod returnerar metadata fรถr de offentliga metoderna frรฅn den angivna klassen sรฅvรคl som frรฅn dess superklass.
getDeclaredMethods() metod returnerar endast metadata fรถr alla metoder frรฅn den angivna klassen.
- Fรฅ namnet pรฅ metoden med hjรคlp av hรคmta namn () metod.
- Hรคmta returtypen fรถr metoden med hjรคlp av getReturnType() metod.
- Fรฅ รฅtkomstmodifierare av metoderna som anvรคnder getModifiers() och Modifiers.toString(int i) metoder.
- Hรคmta metodparametertyper med hjรคlp av getParameterTypes() metod som returnerar en klassmatris.
-
Bli kastat undantag med hjรคlp av getExceptionTypes() metod som returnerar en klassmatris.
- Skapat klassobjekt fรถr Guru99MethodMetaData.class
- Fick all metadata fรถr alla metoder i en Method array
- Skrev ut alla metodnamn som finns i klassen Guru99MethodMetaData.class
- Utskrivna returtyper av metoderna i klassen Guru99MethodMetaData.class
- Skrivit ut alla รฅtkomstmodifierare fรถr metoderna i klassen Guru99MethodMetaData.class
- Utskrivna parametertyper av metoderna i Guru99MethodMetaData.class
-
Utskrivna undantag kastas av metoder i Guru99MethodMetaData.class
- Skapat klassobjekt fรถr Guru99Constructor.class
- Fick all metadata fรถr alla konstruktรถrer i en Constructor-array
- Skrivet ut alla konstruktรถrens namn som finns i klassen Guru99Constructor.class
- Skrev ut alla รฅtkomstmodifierare fรถr konstruktรถrerna i klassen Guru99Constructor.class
- Utskrivna parametertyper av konstruktรถrerna i Guru99Constructor.class
- Utskrivna undantag kastas av konstruktรถrer i Guru99Constructor.class
- Reflektionsprogrammering i java hjรคlper till att hรคmta och รคndra information om klasser och klassmedlemmar sรฅsom variabler, metoder, konstruktorer.
- Reflection API in Java kan implementeras med hjรคlp av klasser i paketet java.lang.reflect och metoder fรถr klassen java.lang.Class.
- Nรฅgra vanliga metoder fรถr java.lang.Class-klassen รคr getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
- Nรฅgra vanliga klasser i java.lang.reflect-paketet รคr Field, Method, Constructor, Modifier, etc.
- Reflection API kan komma รฅt privata metoder och variabler av en klass som kan vara ett sรคkerhetshot.
- Reflection API รคr en kraftfull funktion som tillhandahรฅlls av Java, men det kommer med vissa omkostnader som lรฅngsammare prestanda, sรคkerhetssรฅrbarhet och behรถrighetsproblem. Reflektions-API bรถr dรคrfรถr behandlas som den sista utvรคgen fรถr att utfรถra en operation.
Exempel 3: Hur man skaffar Metadata of Method
Fรถljande exempel visar hur man fรฅr metadata fรถr en metod:
Hรคr skapar vi en klass som heter Guru99MethodMetaData .class med nรฅgra 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");
}
}
Steg fรถr att fรฅ metadata om metoderna i ovanstรฅende klass:
Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr metoderna som finns 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
Exempel 4: Hur man fรฅr metadata frรฅn konstruktรถrer
Fรถljande exempel visar hur man fรฅr metadata frรฅn konstruktรถrer:
Hรคr skapar vi en klass som heter Guru99Constructor.class med olika 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{ }
}
Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr konstruktรถrerna som finns 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("*******************************************");
}
}
}
















