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("*******************************************");
}
}
}
















