Java Reflection API õpetus koos näitega
⚡ Nutikas kokkuvõte
Java Reflection API analüüsib ja muudab klassi võimalusi käitusajal, sh selle välju, meetodeid ja konstruktoreid. See ressurss selgitab paketti java.lang.reflect, paketi java.lang.Class peamisi meetodeid ja nelja näidet, mis loevad klassi, muutuja, meetodi ja konstruktori metaandmeid.
Mis on peegeldus Java?
Java Refleksioon on klassi kõigi võimete analüüsimise ja muutmise protsess käitusajal. Refleksiooni API Java kasutatakse klassi ja selle liikmete (sh väljad, meetodid, konstruktorid jne) manipuleerimiseks käitusajal.
Üks Reflection API eeliseid Java on see, et see saab manipuleerida ka klassi privaatsete liikmetega.
Pakett java.lang.reflect pakub refleksiooni rakendamiseks palju klasse. Klassi java.lang.Class meetodeid kasutatakse konkreetse klassi täielike metaandmete kogumiseks.
Klass paketis java.lang.reflect
Järgmine on nimekiri eri Java klassid Peegelduse rakendamiseks paketis java.lang.reflect:
- Väli: Seda klassi kasutatakse deklaratiivse teabe, näiteks muutuja andmetüübi, juurdepääsu modifikaatori, nime ja väärtuse kogumiseks.
- Meetod: Seda klassi kasutatakse deklaratiivse teabe kogumiseks, näiteks meetodi juurdepääsumodifikaatori, tagastustüübi, nime, parameetrite tüüpide ja erandi tüübi kohta.
- Ehitaja: Seda klassi kasutatakse deklaratiivse teabe, näiteks konstruktori juurdepääsumodifikaatori, nime ja parameetritüüpide kogumiseks.
- Muutja: Seda klassi kasutatakse konkreetse juurdepääsumodifikaatori kohta teabe kogumiseks.
Java.lang.Classis kasutatavad meetodid
- avalik string getNimi(): Tagastab klassi nime.
- avalik klass getSuperklass(): Tagastab ülemklassi viite.
- avalik klass[] getInterfaces(): Tagastab määratud klassi poolt rakendatud liideste massiivi.
- avalik int getModifiers(): Tagastab täisarvulise väärtuse, mis esindab määratud klassi modifikaatoreid ja mis tuleb edastada parameetrina meetodile „public static String toString(int i)”, mis tagastab antud klassi juurdepääsuspetsifikatsiooni.
Kuidas saada klassi kohta täielikku teavet
Teabe saamiseks selle kohta muutujad, meetodite ja konstruktorite jaoks peame looma klassi objekti. Järgnev näide näitab erinevaid viise klassi „Klass” objekti loomiseks:
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; } }
Näide 1: Kuidas saada klassi metaandmeid
Järgnev näide näitab, kuidas hankida metaandmeid, näiteks klassi nime, ülemklassi nime, rakendatud liideseid ja klassi juurdepääsumodifikaatoreid.
Saame allpool nimetatud klassi metaandmed Guru99Base.klass:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- Klassi nimi on: Guru99 Alus
- Selle ligipääsu modifikaatorid on: avalik ja abstract
- Sellel on rakendatud liidesed: jadatav ja klooneeritav
- Kuna see pole ühtegi klassi selgesõnaliselt laiendanud, on selle ülemklass: java.lang.Object
Allolev klass saab metaandmed Guru99Base.class ja prindi see välja:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> 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 using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- Klassi nimi kuvatakse meetodi getName() abil.
- Väljasta superklassi nimi meetodi getSuperclass().getName() abil.
- Väljasta rakendatud liideste nimed.
- Väljasta klassi poolt kasutatavad juurdepääsu modifikaatorid.
Näide 2: Kuidas saada muutuja metaandmeid
Järgnev näide näitab, kuidas saada muutuja metaandmeid.
Siin loome klassi nimega Guru99VariableMetaData.klass koos mõne muutujaga:
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"; }
Toimingud ülaltoodud klassi muutujate kohta metaandmete hankimiseks:
- Loo ülaltoodud klassi klassiobjekt, st Guru99VariableMetaData.klass, nagu allpool näidatud:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Hankige metaandmed väljamassiivi kujul, kasutades käsku getFields() or getDeclaredFields() meetodid nagu allpool:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
. getFields() meetod tagastab nii määratud klassi kui ka selle ülemklassi avalike muutujate metaandmed.
. getDeclaredFields() meetod tagastab ainult määratud klassi kõigi muutujate metaandmed.
- Muutujate nimed saab hankida meetodi „public String getName()” abil.
- Muutujate andmetüübi saamiseks kasutage meetodit „public Class getType()”.
- Muutuja väärtuse saamiseks kasutage meetodit „public xxx get(Field)”. Siin võib xxx olla bait, lühike või mis tahes tüüpi väärtus, mida me tahame hankida.
- Muutujate ligipääsu modifikaatorid saab hankida meetodite getModifiers() ja Modifier.toString(int i) abil.
Siin kirjutame klassi, et saada klassis esinevate muutujate metaandmed Guru99MuutujaMetaAndmed.klass:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; 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 Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- Loodud klassiobjekt Guru99MuutujaMetaAndmed.klass.
- Sain kõik muutujate metaandmed Field-massiivis.
- Prindib kõik klassi muutujate nimed Guru99MuutujaMetaAndmed.klass.
- Printis kõik klassi muutujate andmetüübid.
- Printis välja kõik klassi muutujate juurdepääsu modifikaatorid.
- Printis välja kõigi klassi muutujate väärtused.
Näide 3: Kuidas saada meetodi metaandmeid
Järgnev näide näitab, kuidas meetodi metaandmeid hankida.
Siin loome klassi nimega Guru99MethodMetaData.klass koos mõne meetodiga:
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 Reflection 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"); } }
Sammud ülaltoodud klassi meetodite metaandmete saamiseks:
- Loo ülaltoodud klassi klassiobjekt, st Guru99MethodMetaData.klass, nagu allpool näidatud:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Meetoditeabe saamiseks meetodi massiivis kasutage meetodeid getMethods() ja getDeclaredMethods() järgmiselt:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
. getMethods() meetod tagastab nii määratud klassi kui ka selle ülemklassi avalike meetodite metaandmed. getDeclaredMethods() meetod tagastab ainult määratud klassi kõigi meetodite metaandmed.
- Meetodi nime saamiseks kasutage getName () meetod.
- Meetodi tagastustüübi saamiseks kasutage getReturnType() meetod.
- Hankige meetodite juurdepääsu modifikaatorid, kasutades getModifiers() ja Modifier.toString(int i) meetodid.
- Meetodi parameetrite tüüpide hankimine, kasutades getParameterTypes() meetod, mis tagastab klassi massiivi.
- Saage erandeid, kasutades getExceptionTypes() meetod, mis tagastab klassi massiivi.
Siin kirjutame klassi, et saada klassis esinevate meetodite metaandmed Guru99MethodMetaData.klass:
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 Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Loodud klassiobjekt Guru99MeetodiMetaAndmed.klass.
- Sain kõigi meetodite metaandmed meetodite massiivis.
- Prindis kõik klassis esinevad meetodite nimed.
- Printis klassi meetodite tagastustüübid.
- Printis välja kõik klassi meetodite juurdepääsu modifikaatorid.
- Printis välja meetodite parameetritüübid.
- Väljastas meetodite poolt visatud erandid.
Näide 4: Kuidas saada konstruktorite metaandmeid
Järgnev näide näitab, kuidas hankida konstruktorite metaandmeid.
Siin loome klassi nimega Guru99Constructor.klass erinevate konstruktoritega:
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 { } }
Siin kirjutame klassi, et saada klassis esinevate konstruktorite metaandmed Guru99Konstruktor.klass:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; 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) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Loodud klassiobjekt Guru99Konstruktor.klass.
- Sain kätte kõigi konstruktorite massiivi konstruktorite metaandmed.
- Printis välja kõigi klassis esinevate konstruktorite nimed.
- Printis välja kõik klassi konstruktorite juurdepääsu modifikaatorid.
- Printis konstruktorite parameetritüübid.
- Printis konstruktorite poolt visatud erandid.

















