Это 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());
}
}
Результат выполнения следующий:
Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~
Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах