Mikä on Java-pohdinta?
Java Reflection on luokan kaikkien ominaisuuksien analysointi ja muokkaus ajon aikana. Reflection API in Java -ohjelmaa käytetään luokan ja sen jäsenten manipulointiin, jotka sisältävät kenttiä, menetelmiä, konstruktoria jne. Ajon aikana.
Yksi Java-heijastussovellusliittymän etu on, että se voi myös manipuloida luokan yksityisiä jäseniä.
Java.lang.reflect-paketti tarjoaa monia luokkia pohdinnan java toteuttamiseksi.Java.lang.Class-luokan menetelmiä käytetään tietyn luokan täydellisten metatietojen keräämiseen.
Tässä opetusohjelmassa opit-
- Mikä on heijastus
- Luokka java.lang.reflect-paketissa
- Java.lang.Classissa käytetyt menetelmät
- Kuinka saada täydellistä tietoa luokasta
- Esimerkki 1: Kuinka hankkia luokan metatiedot
- Esimerkki 2: Kuinka saada muuttujan metatiedot
- Esimerkki 3: Menetelmän metatietojen saaminen
- Esimerkki 4: Kuinka hankkia rakentajien metatiedot
Luokka java.lang.reflect-paketissa
Seuraavassa on luettelo Java-luokista java.lang.package-sovelluksessa pohdinta-
- Kenttä : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten tietotyyppi, käyttöoikeuden muokkaaja, muuttujan nimi ja arvo.
- Menetelmä : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten pääsyn muokkaus, palautustyyppi, nimi, parametrityypit ja menetelmän poikkeustyyppi.
- Rakentaja : Tätä luokkaa käytetään keräämään vakuuttavia tietoja, kuten pääsynmuokkaaja, rakentajan nimi ja parametrityypit.
- Muokkaaja : Tätä luokkaa käytetään keräämään tietoja tietystä pääsynmuuttajasta.
Java.lang.Classissa käytetyt menetelmät
- Public String getName () : Palauttaa luokan nimen.
- public Class getSuperclass () : Palauttaa superluokan viitteen
- Julkinen luokka [] getInterfaces () : Palauttaa joukon rajapintoja, jotka määritetty luokka toteuttaa
- Public in getModifiers (): Palauttaa kokonaisluvun, joka edustaa määritetyn luokan muokkaajia ja joka on välitettävä parametrina " public static String toString (int i)" -menetelmään, joka palauttaa tietylle luokalle pääsyn määrittelijän.
Kuinka saada täydellistä tietoa luokasta
Saadaksesi tietoa luokan muuttujista, menetelmistä ja rakentajista meidän on luotava luokan objekti.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;}}
Esimerkki 1: Kuinka hankkia luokan metatiedot
Seuraava esimerkki osoittaa, kuinka hankitaan metatietoja, kuten: luokan nimi, superluokan nimi, toteutetut käyttöliittymät ja luokan käyttömuokkaajat.
Saamme alla olevan luokan Guru99Base.class metatiedot:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Luokan nimi on: Guru99Base
- Sen käyttömuokkaajat ovat: julkisia ja abstrakteja
- Se on toteuttanut käyttöliittymiä: Serialisoitavissa ja Cloneable
- Koska se ei ole nimenomaisesti laajentanut yhtään luokkaa, se on superluokka: 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));}}
- tulosta luokan nimi getName-menetelmällä
- Tulosta superluokan nimi getSuperClass (). GetName () -menetelmällä
- Tulosta toteutettujen rajapintojen nimi
- Tulosta luokan käyttämät pääsymuuttujat
Esimerkki 2: Kuinka saada muuttujan metatiedot
Seuraavat esimerkit osoittavat, kuinka muuttujan metatiedot saadaan:
Tässä luomme luokan nimeltä Guru99VariableMetaData .class muutamilla muuttujilla:
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";}Vaiheet metatietojen saamiseksi yllä olevan luokan muuttujista:
- Luo yllä olevan luokan luokkaobjekti eli Guru99VariableMetaData.class seuraavasti:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Hanki metatiedot kenttäryhmän muodossa käyttämällä getFields () - tai getDeclaredFields () -menetelmiä seuraavasti:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields () -menetelmä palauttaa julkisen muuttujan metatiedot sekä määritetystä luokasta että sen superluokasta .
getDeclaredFields () -menetelmä palauttaa kaikkien määritettyjen luokkien muuttujien metatiedot.
- Hanki muuttujien nimi käyttämällä "public String getName ()" -menetelmää.
- Hanki muuttujien tietotyyppi käyttämällä "public Class getType ()" -menetelmää.
- Hanki muuttujan arvo käyttämällä "public xxx get (Field)" -menetelmää.
Tässä xxx voi olla tavu tai lyhyt minkä tahansa tyyppisestä arvosta, jonka haluamme hakea.
- Hanki muuttujien käyttömuokkaajat getModifier () - ja Modifier.toString (int i) -menetelmillä.
Tässä kirjoitamme luokan saadaksemme luokan Guru99VariableMetaData .class muuttujien metatiedot:
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Luonut luokan objektin Guru99VariableMetaData.classille
- Sait kaikki muuttujien metatiedot Field-taulukossa
- Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien nimet
- Tulosti kaikki muuttujien tietotyypit luokassa Guru99VariableMetaData.class
- Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien käyttömuokkaajat
- Kaikkien muuttujien tulostetut arvot kohdassa Tulostetut luokan Guru99VariableMetaData.class muuttujien kaikki tietotyypit
- Luo yllä olevan luokan luokkaobjekti eli Guru99MethodMetaData.class kuten alla:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Hanki menetelmätiedot Method-taulukosta käyttämällä getMethods () - ja getDeclaredMethods () -menetelmiä seuraavasti:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods () -menetelmä palauttaa julkisten menetelmien metatiedot sekä määritetystä luokasta että sen superluokasta .
getDeclaredMethods () -menetelmä palauttaa kaikkien määritettyjen luokkien metodien metatiedot.
- Hanki menetelmän nimi getName () -menetelmällä.
- Hanki menetelmän palautustyyppi getReturnType () -menetelmällä.
- Hanki menetelmien käyttömuokkaajat getModifiers () - ja Modifiers.toString (int i) -menetelmillä.
- Hanki menetelmäparametrityypit getParameterTypes () -menetelmällä, joka palauttaa luokan taulukon.
- Hanki heitetty poikkeus getExceptionTypes () -menetelmällä, joka palauttaa luokan taulukon.
- Luonut luokan objektin kohteelle Guru99MethodMetaData.class
- Sait kaikki metatiedot kaikista menetelmistä taulukossa Method
- Tulosti kaikki luokan Guru99MethodMetaData.class metodien nimet
- Luokan Guru99MethodMetaData.class menetelmien tulostetut palautustyypit
- Tulosti kaikki Guru99MethodMetaData.class-luokan menetelmien käyttömuokkaajat
- Tulostetut Guru99MethodMetaData.class-menetelmien parametrityypit
- Tulostetut poikkeukset heitetään menetelmillä Guru99MethodMetaData.class
- Luonut luokan objektin Guru99Constructor.classille
- Sait kaikki konstruktorien metatiedot Constructor-taulukossa
- Tulosti kaikki rakentajan nimet luokassa Guru99Constructor.class
- Tulosti kaikki Guru99Constructor.class-luokan rakentajien käyttömuokkaajat
- Rakentajien tulostetut parametrityypit Guru99Constructor.classissa
- Rakentajat heittävät painetut poikkeukset Guru99Constructor.class-kansioon
- Jaavan heijastusohjelmointi auttaa noutamaan ja muokkaamaan tietoja luokista ja luokan jäsenistä, kuten muuttujasta, menetelmistä, konstruktoreista.
- Reflection API Java: ssa voidaan toteuttaa käyttämällä java.lang.reflect-paketin luokkia ja java.lang.Class-luokan menetelmiä.
- Joitakin java.lang.Class-luokan yleisesti käytettyjä menetelmiä ovat getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
- Joitakin java.lang.reflect-paketissa yleisesti käytettyjä luokkia ovat Field, Method, Constructor, Modifier jne.
- Reflection API voi käyttää luokan yksityisiä menetelmiä ja muuttujia, jotka voivat olla tietoturvauhkia.
- Reflection API on Java: n tarjoama tehokas ominaisuus, mutta siihen sisältyy joitain yleiskustannuksia, kuten hitaampi suorituskyky, tietoturva-aukko ja lupakysymykset. Siksi heijastussovellusliittymää tulisi pitää viimeisenä keinona suorittaa toimenpide.
Esimerkki 3: Menetelmän metatietojen saaminen
Seuraavat esimerkit osoittavat, miten menetelmän metatiedot saadaan:
Tässä luomme luokan nimeltä Guru99MethodMetaData .class joillakin menetelmillä
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");}}
Vaiheet metatietojen saamiseksi yllä olevan luokan menetelmistä:
Tässä kirjoitamme luokan saadaksemme luokan Guru99MethodMetaData.class metatiedot:
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Esimerkki 4: Kuinka hankkia rakentajien metatiedot
Seuraavat esimerkit osoittavat, miten saat rakennuttajien metatiedot:
Tässä luomme luokan nimeltä Guru99Constructor.class eri rakentajilla:
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{ }}
Tässä kirjoitamme luokan saadaksemme luokan Guru99Constructor.class rakentajien metatiedot:
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("*******************************************");}}}
Yhteenveto: