Урок 15

Reflection API


Рефлексия (от позднелат. reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов. Можно также выполнять операции над полями и методами которые исследуются.

1. Класс Сlass 

Класс с именем Сlass представляет характеристики класса, экземпляром которого является объект.

Он предоставляет информацию:

  • является ли класс интерфейсом, массивом или примитивным типом;
  • каков суперкласс объекта;
  • каково имя класса;
  • какие в нем конструкторы, поля, методы и вложенные классы.

В классе Сlass нет конструкторов. Экземпляр этого класса создается исполняющей системой Java во время загрузки класса и предоставляется методом getClass() класса Object.

Пример 1. Использования класса Class.

public class ClassDemo1 {
    public static void main(String[] args) {
        getClassName1();
        getClassName2();
        getClassName3();
    }

    private static void getClassName1() {
        String s = "Это строка";
        Class aClass = s.getClass();
        System.out.println(aClass);
    }

    private static void getClassName2() {
        try {
            Class aClass = Class.forName("java.lang.String");
            System.out.println(aClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static void getClassName3() {
        Class aClass = String.class;
        System.out.println(aClass);
    }
}

Пример 2. Использования класса Class.

import java.io.Serializable;

public class ClassDemo2 {
       public static void main(String[] args) {
        int[] array = new int[4];

        printInfo(array.getClass());
        printInfo(Serializable.class);
        printInfo(Integer.class);
        printInfo(double.class);
    }

    private static void printInfo(Class arrayClass) {
        System.out.println("Class name " + arrayClass.getName());
        System.out.println("Is Array? " + arrayClass.isArray());
        System.out.println("Is Interface? " + arrayClass.isInterface());
        System.out.println("Is Primitive? " + arrayClass.isPrimitive());
        System.out.println();
    }
}

Пример 3. Использования класса Class.

import java.util.Arrays;

public class ClassDemo3 {
    public static void main(String[] args) {
        Class heavyBoxClass = HeavyBox1.class;

        System.out.println("Declared Constructors: "
                + Arrays.toString(heavyBoxClass.getDeclaredConstructors()));
        System.out.println("Constructors: "
                + Arrays.toString(heavyBoxClass.getConstructors()));

        System.out.println("Declared Methods: "
                + Arrays.toString(heavyBoxClass.getDeclaredMethods()));
        System.out.println("Methods: "
                + Arrays.toString(heavyBoxClass.getMethods()));

        System.out.println("Declared Fields: "
                + Arrays.toString(heavyBoxClass.getDeclaredFields()));
        System.out.println("Fields: "
                + Arrays.toString(heavyBoxClass.getFields()));
    }
}

2. Методы класса Class

  • getSuperclass() - возвращает суперкласс объекта ссылочного типа.
  • getPackage() - возвращает пакет.
  • getModifiers() - возвращает модификаторы класса.

Логические методы позволяющие уточнить, является ли объект массивом, интерфейсом или примитивным типом.

  • isArray()
  • isInterface()
  • isPrimitive()

Если объект ссылочного типа, то можно извлечь сведения о вложенных классах, конструкторах, методах в виде массива:

  • getDeclaredClasses()
  • getDeclaredConstructors()
  • getDeclaredMethods()
  • getDeclaredFields()

Методы возвращают такие же массивы, но не всех, а только открытых членов класса.

  • getClasses()
  • getConstructors()
  • getMethods()
  • getFields()


0 comments
Leave your comment: