Принцип механизма отражения Java | Серия аннотаций и отражений Java (2)

задняя часть
Принцип механизма отражения Java | Серия аннотаций и отражений Java (2)

Это 19-й день моего участия в Gengwen Challenge, Подробности о мероприятии см.:Обновить вызов


Статьи по Теме

Серия аннотаций и отражений Java:Аннотации Java и серия отражений


предисловие

Обобщите важность в одном предложении:Почти все базовые фреймворки реализованы с использованием отражения!

I. Обзор

Динамический язык:Это своего рода язык, который может изменять свою структуру во время выполнения, говоря простым языком, код может изменять свою структуру во время выполнения в соответствии с определенными условиями. Основные динамические языки: Object-C, C#, JavaScript, PHP, Python и др.Статический язык:В соответствии с динамическим языком язык, структура времени выполнения которого неизменяема, является статическим языком. такие как Java, C, C++

Но Java можно преобразовать вКвазидинамический язык !!!

Механизм отражения

Механизм отражения позволяет программе получать внутреннюю информацию любого класса с помощью Reflection API во время выполнения и может напрямую манипулировать внутренними свойствами и методами любого объекта.

1. Java.Отражение

Как мы используем объект во время разработки?

Обычный способ:Введите требуемое имя «класса пакета» → создайте экземпляр через новый → получите созданный объект

在这里插入图片描述

Отражение:Создать экземпляр объекта → метод getClass() → получить полное имя «класса пакета»

在这里插入图片描述

Каковы преимущества и недостатки для нас в этом пути?

преимущество:Может быть достигнуто динамическое создание и компиляция объектов, что отражает большую гибкость

недостаток:Это влияет на производительность, поскольку использование отражения в основном является операцией интерпретации, которая всегда медленнее, чем обычная операция.

2. Несколько способов получения объектов класса

①получить класс

Зная экземпляр класса, вызовите метод экземпляра getClass(), чтобы получить объект класса.

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

在这里插入图片描述

Как видите, здесь есть метод getClass, затем он есть у класса Object, что доказывает, что этот метод должен быть у всех классов!

То есть: имя класса можно получить через объектное отражение.

在这里插入图片描述

②Класс.Класс

Если известен конкретный класс, то его можно получить через атрибут класса class.Этот способ самый безопасный и надежный, а программа имеет самую высокую производительность.

在这里插入图片描述

③для имени

Полное имя класса известно, и класс находится в пути к классу, который можно получить с помощью статического метода forName() класса Class, который может вызвать исключение ClassNotFoundException.

在这里插入图片描述

④Имя класса.Тип

еслиВстроенные примитивные типы данныхВы можете напрямую использовать имя класса. Тип

在这里插入图片描述

⑤class.getSuperclass()

Используйте ClassLoader, чтобы получить тип родительского класса.

在这里插入图片描述

По объекту calss можно получить объект родительского класса объекта calss!

3. Резюме:

Все коды следующие:

		Person person = new Person();

        //通过实例化对象获取class对象
        Class c1 = person.getClass();
        System.out.println("c1 "+c1.hashCode());

        //通过类.Class获取class对象
        Class c2 = Person.class;
        System.out.println("c2 "+c2.hashCode());

        //通过forName获取class对象
        Class c3 = Class.forName("com.dbright.Java反射.Person");
        System.out.println("c3 "+c3.hashCode());

        //通过类名.Type
        Class c4 = Integer.TYPE;
        Class c41 = Integer.class;
        System.out.println("c4 "+c4.hashCode());
        System.out.println("c41 "+c41.hashCode());

        //对象.getSuperclass()
        Class c5 = c1.getSuperclass();
        System.out.println("c5 "+c5.hashCode());

Результат выполнения следующий:

在这里插入图片描述

Для приведенных выше результатов мы можем разделить его на три части:

1. c1 c2 c3 получаются тремя разными способами, но значения hashCode у них одинаковые.

2. Базовый тип java можно получить по методу .type, по значению hashCode имеет тот же эффект, что и метод .class.

3. Мы можем получить объект класса родительского класса!

результат:

Информация, которую объект может получить, глядя в зеркало: свойства, методы и конструкторы класса, а также интерфейсы, реализуемые классом. Для каждого класса JRE хранит для него неизменяемый объект типа Class.

  • Класс сам по себе тоже класс
  • Объекты класса могут быть созданы только системой
  • Загруженный класс будет иметь только один экземпляр класса в JVM.
  • Объект класса соответствует файлу .class, загруженному в JVM.
  • Экземпляры каждого класса будут помнить, из какого экземпляра класса они были созданы.
  • Все загруженные структуры в классе можно полностью получить через Class
  • Класс Class является корнем Reflection.Для любого класса, который вы хотите динамически загружать и запускать, вы должны сначала получить соответствующий объект класса.

4. Небольшое расширение

Все типы класса

//所有类型的Class
public class ReflectionTest{
    public static void main(String[] args) {
        Class c1 = Object.class;  //类 class java.lang.Object
        Class c2 = Comparable.class;  //接口 interface java.lang.Comparable
        Class c3 = String[].class;  //一维数组 class [Ljava.lang.String;
        Class c4 = int[][].class;  //二维数组 class [[I
        Class c5 = Override.class;  //注解 interface java.lang.Override
        Class c6 = ElementType.class;  //枚举 class java.lang.annotation.ElementType
        Class c7 = Integer.class;  //基本数据类型 class java.lang.annotation.ElementType
        Class c8 = void.class;  //void void
        Class c9 = Class.class;  //Class class java.lang.Class

        //Alt + 左键:全选后复制粘贴
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);
        System.out.println(c9);

        //只要元素类型与唯独一样,就是同一个Class
        int[] a = new int[10];
        int[] b = new int[100];
        System.out.println(a.getClass().hashCode());
        System.out.println(b.getClass().hashCode());
    }
}

Результат выполнения следующий:

在这里插入图片描述


Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~

Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах