Java Reflection API -opastus ja esimerkki
Mitä on heijastus Java?
Java Reflection on prosessi, jossa analysoidaan ja muokataan kaikkia luokan ominaisuuksia ajon aikana. Reflection API sisään Java käytetään manipuloimaan luokkaa ja sen jäseniä, jotka sisältävät kenttiä, menetelmiä, konstruktoria jne. ajon aikana.
Yksi heijastussovellusliittymän etu Java Se voi manipuloida myös luokan yksityisiä jäseniä.
Paketti java.lang.reflect tarjoaa monia luokkia heijastuksen toteuttamiseen java.Java.lang.Class-luokan menetelmät käytetään keräämään tietyn luokan täydelliset metatiedot.
Luokka java.lang.reflect-paketissa
Seuraavassa on luettelo eri Java luokat java.lang.packagessa reflektoinnin toteuttamiseksi-
- Kenttä: Tätä luokkaa käytetään määrittämään ilmoittavia tietoja, kuten tietotyyppi, käyttöoikeusmuuttaja, muuttujan nimi ja arvo.
- Menetelmä: Tätä luokkaa käytetään keräämään deklaratiivisia tietoja, kuten käyttöoikeusmuunnin, palautustyyppi, nimi, parametrityypit ja menetelmän poikkeustyyppi.
- Rakentaja: Tätä luokkaa käytetään määrittämään ilmoittavia tietoja, kuten pääsyn muokkaaja, rakentajan nimi ja parametrityypit.
- muutos: Tätä luokkaa käytetään keräämään tietoja tietystä pääsyn muokkaajasta.
Java.lang.Classissa käytetyt menetelmät
- Julkinen merkkijono getName (): Palauttaa luokan nimen.
- julkinen luokka getSuperclass(): Palauttaa superluokan viittauksen
- Julkinen luokka[] getInterfaces() : Palauttaa määritetyn luokan toteuttamien liitäntöjen joukon
-
Julkinen getModifiersissa (): Palauttaa kokonaisluvun, joka edustaa määritetyn luokan modifioijia, joka on välitettävä parametrina "julkinen staattinen merkkijono merkkijonoon (int i )" menetelmä, joka palauttaa pääsyn määritteen tietylle luokalle.
Kuinka saada täydelliset tiedot luokasta
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;
}
}
Esimerkki 1: Luokan metatietojen hankkiminen
Seuraava esimerkki näyttää, kuinka saada metatietoja, kuten: Luokan nimi, superluokan nimi, toteutetut rajapinnat ja luokan käyttöoikeusmuuntimet.
Saamme metatiedot alla olevasta luokasta nimeltä Guru99Base.class:
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- Kurssin nimi on: Guru99Base
- Sen käyttöoikeudet ovat: julkinen ja abstrakti
- Se on toteuttanut käyttöliittymät: Serialisable ja Cloneable
- Koska se ei ole laajentanut mitään luokkaa nimenomaisesti, sen superluokka on: java.lang.Object
Alla oleva luokka saa Guru99Base.classin metatiedot ja tulostaa ne:
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));
}
}
- tulosta luokan nimi käyttämällä getName-menetelmää
- Tulosta superluokan nimi käyttämällä getSuperClass().getName()-metodia
- Tulosta toteutettujen rajapintojen nimet
- Tulosta luokan käyttämät käyttöoikeudet
Esimerkki 2: Kuinka saada muuttujan metatiedot
Seuraavat esimerkit osoittavat, kuinka saada muuttujan metatiedot:
Täällä luomme luokan nimeltä Guru99VariableMetaData .class, jossa on joitain muuttujia:
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";
}
-
Luo yllä olevan luokan eli Guru99VariableMetaData.class luokkaobjekti seuraavasti:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Hanki metatiedot kenttätaulukon muodossa käyttämällä getFields() or getDeclaredFields() alla olevat menetelmät:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() menetelmä palauttaa julkisen muuttujan metatiedot määritetystä luokasta sekä sen superluokasta.
getDeclaredFields() Metodi palauttaa vain määritetyn luokan kaikkien muuttujien metatiedot.
- Hanki muuttujien nimet käyttämällä "public String getName()" -menetelmää.
- Hanki muuttujien tietotyypit 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 noutaa.
-
Hanki muuttujien käyttöoikeusmuuntimet käyttämällä getModifier()- ja Modifier.toString(int i) -menetelmiä.
Tässä kirjoitamme luokkaa saadaksemme luokassa Guru99VariableMetaData .class olevien 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } - Luotu luokkaobjekti Guru99VariableMetaData.classille
- Sain kaikki muuttujien metatiedot kenttätaulukossa
- Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien nimet
- Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien tietotyypit
- Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien pääsyoikeudet
- Kaikkien muuttujien tulostetut arvot luokkaan Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien tietotyypit
-
Luo yllä olevan luokan eli Guru99MethodMetaData.class luokkaobjekti seuraavasti:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Hanki menetelmätiedot Method-taulukossa käyttämällä getMethods()- ja getDeclaredMethods()-metodeja seuraavasti:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods() metodi palauttaa julkisten menetelmien metatiedot määritetystä luokasta sekä sen superluokasta.
getDeclaredMethods() Metodi palauttaa vain määritetyn luokan kaikkien menetelmien metatiedot.
- Hanki menetelmän nimi käyttämällä getName () menetelmällä.
- Hanki menetelmän palautustyyppi käyttämällä getReturnType() menetelmällä.
- Hanki menetelmien käyttöoikeudet getModifiers() ja Modifiers.toString(int i) menetelmiä.
- Hanki menetelmäparametrityypit käyttämällä getParameterTypes() menetelmä, joka palauttaa luokkataulukon.
-
Saat heitetty poikkeus käyttämällä getExceptionTypes() menetelmä, joka palauttaa luokkataulukon.
- Luotu luokkaobjekti Guru99MethodMetaData.classille
- Sain kaikki metatiedot kaikista menetelmistä Method-taulukossa
- Tulostettiin kaikki luokassa Guru99MethodMetaData.class olevat menetelmänimet
- Luokan Guru99MethodMetaData.class metodien tulostetut palautustyypit
- Tulostettu kaikki luokan Guru99MethodMetaData.class menetelmien pääsymääritykset
- Guru99MethodMetaData.classin menetelmien tulostetut parametrityypit
-
Tulostetut poikkeukset heitetään Guru99MethodMetaData.classin menetelmillä
- Luotu luokkaobjekti Guru99Constructor.classille
- Sain kaikki metatiedot kaikista rakentajista Constructor-taulukossa
- Tulostettu kaikki luokassa Guru99Constructor.class olevat rakentajien nimet
- Tulostettu kaikki luokan Guru99Constructor.class rakentajien pääsymääritykset
- Guru99Constructor.class konstruktorien tulostetut parametrityypit
- Guru99Constructor.classin rakentajat heittävät painettuja poikkeuksia
- Javan heijastusohjelmointi auttaa hakemaan ja muokkaamaan tietoa luokista ja luokan jäsenistä, kuten muuttujista, menetelmistä, rakentajista.
- Reflection API sisään Java voidaan toteuttaa käyttämällä java.lang.reflect-paketin luokkia ja java.lang.Class-luokan menetelmiä.
- Joitakin yleisesti käytettyjä java.lang.Class-luokan menetelmiä ovat getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
- Jotkut java.lang.reflect-paketin yleisesti käytetyt luokat ovat Field, Method, Constructor, Modifier jne.
- Reflection API voi käyttää luokan yksityisiä menetelmiä ja muuttujia, jotka voivat olla turvallisuusuhka.
- Reflection API on tehokas ominaisuus Java, mutta siihen liittyy joitain yleiskustannuksia, kuten hitaampi suorituskyky, tietoturvahaavoittuvuus ja lupaongelma. Tästä syystä heijastussovellusliittymää tulisi käsitellä viimeisenä keinona suorittaa toiminto.
Esimerkki 3: Kuinka saada menetelmän metatiedot
Seuraavat esimerkit osoittavat, kuinka menetelmän metatiedot saadaan:
Täällä luomme luokkaa 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 yllä olevan luokan menetelmien metatietojen saamiseksi:
Täällä kirjoitamme luokkaa saadaksemme luokassa Guru99MethodMetaData.class olevien menetelmien 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
Esimerkki 4: Kuinka saada rakentajien metatiedot
Seuraavat esimerkit osoittavat, kuinka rakentajien metatiedot saadaan:
Täällä luomme Guru99Constructor.class-nimisen luokan 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 luokkaa saadaksemme luokassa Guru99Constructor.class olevien rakentajien metatiedot:
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("*******************************************");
}
}
}
















