Урок за API за отразяване на Java с пример

Съдържание:

Anonim

Какво е отражение в Java?

Java Reflection е процес на анализиране и модифициране на всички възможности на клас по време на изпълнение. API за отразяване в Java се използва за манипулиране на клас и неговите членове, които включват полета, методи, конструктор и т.н. по време на изпълнение.

Едно от предимствата на API за размисъл в Java е, че той може да манипулира и частни членове на класа.

Пакетът java.lang.reflect предоставя много класове за реализиране на отражение java.Methods на класа java.lang.Class се използва за събиране на пълните метаданни на определен клас.

В този урок ще научите -

  • Какво е Отражение
  • Клас в java.lang.reflect пакет
  • Методи, използвани в java.lang.Class
  • Как да получите пълна информация за клас
  • Пример 1: Как да получите метаданни на класа
  • Пример 2: Как да получите метаданни на променлива
  • Пример 3: Как да получите метаданни на метода
  • Пример 4: Как да получите метаданни на конструктори

Клас в java.lang.reflect пакет

Следва списък на различни Java класове в java.lang.package за внедряване на отражение-

  • Поле : Този клас се използва за събиране на декларативна информация като тип данни, модификатор на достъп, име и стойност на променлива.
  • Метод : Този клас се използва за събиране на декларативна информация като модификатор на достъпа, тип на връщане, име, типове параметри и тип изключения на метод.
  • Конструктор : Този клас се използва за събиране на декларативна информация като модификатор на достъпа, име и параметри на конструктор.
  • Модификатор : Този клас се използва за събиране на информация за определен модификатор на достъп.

Методи, използвани в java.lang.Class

  • Public String getName () : Връща името на класа.
  • public Class getSuperclass () : Връща препратката към супер класа
  • Публичен клас [] getInterfaces () : Връща масив от интерфейси, изпълнени от посочения клас
  • Публично в getModifiers (): Връща целочислена стойност, представляваща модификаторите на посочения клас, която трябва да бъде предадена като параметър на метода " public static String toString (int i)" , който връща спецификатора за достъп за дадения клас.

Как да получите пълна информация за клас

За да получим информация за променливи, методи и конструктори на клас, трябва да създадем обект от класа.
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: Как да получите метаданни на класа

    Следващият пример показва как да получите метаданни като: Име на клас, име на супер клас, внедрени интерфейси и модификатори на достъп на клас.

    Ще получим метаданните от клас под име Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Името на класа е: Guru99Base
    2. Модификаторите за достъп са: публични и абстрактни
    3. Той е реализирал интерфейси: сериализуем и клонируем
    4. Тъй като не е разширил нито един клас изрично, той е супер клас: java.lang.Object
    По-долу класът ще получи метаданните на Guru99Base.class и ще ги отпечата:
    import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClass  guru99ClassObj = 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));}} 
    1. отпечатайте името на класа, използвайки метода getName
    2. Отпечатайте името на супер класа, като използвате метода getSuperClass (). GetName ()
    3. Отпечатайте името на внедрените интерфейси
    4. Отпечатайте модификаторите за достъп, използвани от класа

    Пример 2: Как да получите метаданни на променлива

    Следващите примери показват как да получите метаданни на променлива:

    Тук създаваме клас с име Guru99VariableMetaData .class с някои променливи:

    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";}
    Стъпки за получаване на метаданните за променливите в горния клас:
    1. Създайте обекта на класа от горния клас, т.е. Guru99VariableMetaData.class, както е показано по-долу:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Вземете метаданните под формата на масив на поле, използвайки методите getFields () или getDeclaredFields () , както е показано по-долу:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    методът getFields () връща метаданни на публичната променлива от посочения клас, както и от нейния супер клас.

    методът getDeclaredFields () връща метаданни на всички променливи само от посочения клас.

    1. Вземете името на променливите, използвайки метода "public String getName ()".
    2. Вземете типа данни на променливите, използвайки метода "public Class getType ()".
    3. Вземете стойността на променливата, използвайки метода "public xxx get (Field)".

      Тук xxx може да е байт или да е кратък от всякакъв вид стойност, която искаме да извлечем.

    4. Вземете модификаторите за достъп на променливите с помощта на методите getModifier () и Modifier.toString (int i).

      Тук пишем клас, за да получим метаданните на променливите, присъстващи в класа Guru99VariableMetaData .class:

      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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Създаден обект на клас за Guru99VariableMetaData.class
      2. Получих всички метаданни на променливите в масив Field
      3. Отпечатани всички имена на променливи в класа Guru99VariableMetaData.class
      4. Отпечатани всички типове данни на променливите в класа Guru99VariableMetaData.class
      5. Отпечатани всички модификатори на достъп на променливите в класа Guru99VariableMetaData.class
      6. Отпечатани стойности на всички променливи в Отпечатани всички типове данни на променливите в класа Guru99VariableMetaData.class

      Пример 3: Как да получите метаданни на метода

      Следващите примери показват как да получите метаданни на метод:

      Тук създаваме клас с име 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");}} 

      Стъпки за получаване на метаданните за методите в горния клас:

      1. Създайте обекта на класа от горния клас, т.е. Guru99MethodMetaData.class, както е показано по-долу:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Вземете информация за метода в масив от методи, като използвате методите getMethods () и getDeclaredMethods (), както е показано по-долу:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        методът getMethods () връща метаданни на публичните методи от посочения клас, както и от неговия супер клас.

        методът getDeclaredMethods () връща метаданни на всички методи само от посочения клас.

      3. Вземете името на метода, използвайки метода getName () .
      4. Вземете типа на връщане на метода, използвайки метода getReturnType () .
      5. Вземете модификатори на достъп до методите, използвайки методите getModifiers () и Modifiers.toString (int i) .
      6. Вземете типове параметри на метода, като използвате метода getParameterTypes () , който връща масив от клас.
      7. Получете изхвърлено изключение с помощта на метода getExceptionTypes () , който връща масив от клас.

      Тук пишем клас, за да получим метаданните на методите, присъстващи в класа 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
      1. Създаден обект на клас за Guru99MethodMetaData.class
      2. Получих всички метаданни на всички методи в масив от методи
      3. Отпечатани всички имена на методи, присъстващи в класа Guru99MethodMetaData.class
      4. Отпечатани типове връщане на методите в класа Guru99MethodMetaData.class
      5. Отпечатани всички модификатори за достъп на методите в класа Guru99MethodMetaData.class
      6. Типове отпечатани параметри на методите в Guru99MethodMetaData.class
      7. Отпечатаните изключения се изхвърлят от методи в Guru99MethodMetaData.class

      Пример 4: Как да получите метаданни на конструктори

      Следващите примери показват как да получите метаданни на конструктори:

      Тук създаваме клас с име Guru99Constructor.class с различни конструктори:

      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{ }}

      Тук пишем клас, за да получим метаданните на конструкторите, присъстващи в класа Guru99Constructor.class:

      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("*******************************************");}}}
      1. Създаден обект на клас за Guru99Constructor.class
      2. Има всички метаданни на всички конструктори в масив на конструктор
      3. Отпечатани всички имена на конструктора, присъстващи в класа Guru99Constructor.class
      4. Отпечатани всички модификатори за достъп на конструкторите в класа Guru99Constructor.class
      5. Типове отпечатани параметри на конструкторите в Guru99Constructor.class
      6. Отпечатаните изключения се изхвърлят от конструктори в Guru99Constructor.class

      Резюме:

      • Програмирането на отражение в java помага при извличането и модифицирането на информация за класове и членове на класа като променлива, методи, конструктори.
      • API за отразяване в Java може да бъде реализиран с помощта на класове в пакета java.lang.reflect и методи на класа java.lang.Class.
      • Някои често използвани методи на класа java.lang.Class са getName (), getSuperclass (), getInterfaces (), getModifiers () и др.
      • Някои често използвани класове в пакета java.lang.reflect са Field, Method, Constructor, Modifier и др.
      • API за отразяване може да осъществява достъп до частни методи и променливи от клас, които могат да представляват заплаха за сигурността.
      • Reflection API е мощна възможност, предоставена от Java, но идва с някои режийни разходи като по-бавна производителност, уязвимост на сигурността и проблем с разрешенията. Следователно API за отражение трябва да се третира като последна мярка за извършване на операция.