Kas ir pārdomas Java?
Java Reflection ir process, kurā tiek analizētas un pārveidotas visas klases iespējas izpildes laikā. Reflection API Java tiek izmantots, lai manipulētu ar klasi un tās dalībniekiem, kas izpildlaikā ietver laukus, metodes, konstruktoru utt.
Viena no Java atspoguļošanas API priekšrocībām ir tā, ka tā var manipulēt arī ar klases privātajiem dalībniekiem.
Pakete java.lang.reflect nodrošina daudzas klases refleksijas java ieviešanai. Klases java.lang.Class metodes tiek izmantotas, lai apkopotu konkrētas klases pilnīgus metadatus.
Šajā apmācībā jūs uzzināsiet
- Kas ir pārdomas
- Nodarbība java.lang.reflect paketē
- Java.lang.Class izmantotās metodes
- Kā iegūt pilnīgu informāciju par klasi
- 1. piemērs: Kā iegūt klases metadatus
- 2. piemērs: Kā iegūt mainīgā metadatus
- 3. piemērs: Kā iegūt metodes metadatus
- 4. piemērs: Kā iegūt konstruktoru metadatus
Nodarbība java.lang.reflect paketē
Tālāk ir saraksts ar dažādām Java klasēm java.lang.package, lai ieviestu refleksiju
- Lauks : šo klasi izmanto, lai apkopotu deklaratīvu informāciju, piemēram, datu tipu, piekļuves modifikatoru, mainīgā nosaukumu un vērtību.
- Metode : Šo klasi izmanto, lai apkopotu deklaratīvu informāciju, piemēram, piekļuves modifikatoru, atgriešanas veidu, nosaukumu, parametru tipus un metodes izņēmuma veidu.
- Konstruktors : Šo klasi izmanto, lai apkopotu deklaratīvu informāciju, piemēram, piekļuves modifikatoru, konstruktora nosaukumu un parametru tipus.
- Modifikators : šo klasi izmanto, lai apkopotu informāciju par konkrētu piekļuves modifikatoru.
Java.lang.Class izmantotās metodes
- Public String getName () : atgriež klases nosaukumu.
- public Class getSuperclass () : atgriež superklases atsauci
- Publiskā klase [] getInterfaces () : atgriež masīvu ar saskarnēm, kuras ieviesusi norādītā klase
- Public in getModifiers (): atgriež veselu skaitļu vērtību, kas apzīmē norādītās klases modifikatorus, kas jānodod kā parametrs metodei " public static String toString (int i)", kas atgriež konkrētās klases piekļuves specifikatoru.
Kā iegūt pilnīgu informāciju par klasi
Lai iegūtu informāciju par klases mainīgajiem, metodēm un konstruktoriem, mums jāizveido klases objekts.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;}}
1. piemērs: Kā iegūt klases metadatus
Šis piemērs parāda, kā iegūt tādus metadatus kā: klases nosaukums, super klases nosaukums, ieviestās saskarnes un klases piekļuves modifikatori.
Mēs iegūsim zemāk esošās klases metadatus ar nosaukumu Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Nodarbības nosaukums ir: Guru99Base
- Tās piekļuves modifikatori ir: publiski un abstrakti
- Tajā ir ieviestas saskarnes: Serializējamas un Klonējamas
- Tā kā tā nav skaidri paplašinājusi nevienu klasi, tā ir super klase: 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));}}
- izdrukājiet klases nosaukumu, izmantojot metodi getName
- Izmantojot metodi getSuperClass (). GetName (), izdrukājiet superklases nosaukumu
- Izdrukājiet ieviesto saskarņu nosaukumu
- Izdrukājiet klases izmantotos piekļuves modifikatorus
2. piemērs: Kā iegūt mainīgā metadatus
Šie piemēri parāda, kā iegūt mainīgā metadatus:
Šeit mēs izveidojam klasi ar nosaukumu Guru99VariableMetaData .class ar dažiem mainīgajiem:
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";}Darbības, lai iegūtu metadatus par iepriekšminētās klases mainīgajiem:
- Izveidojiet iepriekš minētās klases objektu, ti, Guru99VariableMetaData.class, kā norādīts zemāk:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Iegūstiet metadatus lauka masīva veidā, izmantojot tālāk norādītās metodes getFields () vai getDeclaredFields () :
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields () metode atgriež publiskā mainīgā metadatus gan no norādītās klases, gan no tā superklases.
getDeclaredFields () metode atgriež visu mainīgo metadatus tikai no norādītās klases.
- Iegūstiet mainīgo nosaukumu, izmantojot metodi “public String getName ()”.
- Iegūstiet mainīgo datu tipu, izmantojot metodi "public Class getType ()".
- Iegūstiet mainīgā vērtību, izmantojot metodi "public xxx get (Field)".
Šeit xxx var būt jebkura veida vērtības baits vai tās garums, kuru mēs vēlamies iegūt.
- Iegūstiet mainīgo piekļuves modifikatorus, izmantojot metodes getModifier () un Modifier.toString (int i).
Šeit mēs rakstām klasi, lai iegūtu klasē Guru99VariableMetaData .class esošo mainīgo metadatus:
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Izveidoja klases objektu vietnei Guru99VariableMetaData.class
- Iegūti visi lauka masīva mainīgo lielumu metadati
- Izdrukāja visus mainīgo nosaukumus klasē Guru99VariableMetaData.class
- Izdrukāja visus mainīgo lielumu datus Guru99VariableMetaData.class klasē
- Izdrukāja visus klases Guru99VariableMetaData.class mainīgo piekļuves modifikatorus
- Visu mainīgo lielumu drukātās vērtības sadaļā Guru99VariableMetaData.class visu mainīgo datu tipu drukāšana
- Izveidojiet iepriekš minētās klases objektu, ti, Guru99MethodMetaData.class, kā norādīts zemāk:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Iegūstiet informāciju par metodi masīvā Method, izmantojot getMethods () un getDeclaredMethods () metodes, kā norādīts tālāk:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods () metode atgriež publisko metožu metadatus no norādītās klases, kā arī no tās superklases.
getDeclaredMethods () metode atgriež visu metožu datus tikai no norādītās klases.
- Iegūstiet metodes nosaukumu, izmantojot metodi getName () .
- Iegūstiet metodes atgriešanas veidu, izmantojot metodi getReturnType () .
- Iegūstiet metožu piekļuves modifikatorus, izmantojot metodes getModifiers () un Modifiers.toString (int i) .
- Iegūstiet metodes parametru tipus, izmantojot metodi getParameterTypes (), kas atgriež klases masīvu.
- Iegūstiet izņēmumu, izmantojot metodi getExceptionTypes (), kas atgriež klases masīvu.
- Izveidoja klases objektu vietnei Guru99MethodMetaData.class
- Dabūja visus metadatus par visām metožu masīvā Method
- Izdrukāja visus metožu nosaukumus, kas atrodas klasē Guru99MethodMetaData.class
- Iespiesti metožu atgriešanas veidi klasē Guru99MethodMetaData.class
- Izdrukāja visus klases Guru99MethodMetaData.class metožu piekļuves modifikatorus
- Drukāti parametru veidi metodēm Guru99MethodMetaData.class
- Izdrukātos izņēmumus ar metodēm met Guru99MethodMetaData.class
- Izveidoja klases objektu vietnei Guru99Constructor.class
- Ieguvuši visus konstruktoru masīvu visus konstruktoru metadatus
- Izdrukāja visus konstruktora vārdus, kas bija klasē Guru99Constructor.class
- Izdrukāja visus konstruktoru piekļuves modifikatorus klasē Guru99Constructor.class
- Izdrukāti konstruktoru parametru veidi Guru99Constructor.class
- Izdrukātus izņēmumus konstruktori izmet vietnē Guru99Constructor.class
- Pārdomu programmēšana Java palīdz iegūt un modificēt informāciju par klasēm un klases biedriem, piemēram, mainīgo, metodēm, konstruktoriem.
- Pārdomu API Java var īstenot, izmantojot java.lang.reflect paketes klases un klases java.lang.Class metodes.
- Dažas parasti izmantotās java.lang.Class metodes ir getName (), getSuperclass (), getInterfaces (), getModifiers () utt.
- Dažas paketā java.lang.reflect parasti lietotās klases ir Field, Method, Constructor, Modifier utt.
- Reflection API var piekļūt klases privātajām metodēm un mainīgajiem, kas varētu apdraudēt drošību.
- Reflection API ir spēcīga Java piedāvāta spēja, taču tai ir dažas pieskaitāmās izmaksas, piemēram, lēnāka veiktspēja, drošības ievainojamība un atļauju problēma. Tādējādi refleksijas API ir jāuzskata par pēdējo līdzekli operācijas veikšanai.
3. piemērs: Kā iegūt metodes metadatus
Šie piemēri parāda, kā iegūt metodes metadatus:
Šeit mēs ar dažām metodēm izveidojam klasi ar nosaukumu Guru99MethodMetaData .class
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");}}
Darbības, lai iegūtu metadatus par iepriekšminētās klases metodēm:
Šeit mēs rakstām klasi, lai iegūtu meto datus par metodēm, kas atrodas klasē 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
4. piemērs: Kā iegūt konstruktoru metadatus
Šie piemēri parāda, kā iegūt konstruktoru metadatus:
Šeit mēs izveidojam klasi ar nosaukumu Guru99Constructor.class ar dažādiem konstruktoriem:
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{ }}
Šeit mēs rakstām klasi, lai iegūtu klasē Guru99Constructor.class esošo konstruktoru metadatus:
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("*******************************************");}}}
Kopsavilkums: