Механизм отражения Java (1)
В сочетании с официальным руководством по отражению Oracle, написанным с помощью JDK8, просмотрите знания об отражении. В конце добавьте небольшой пример.
основное содержание
Основное содержание этого блога состоит в том, чтобы кратко представить концепцию отражения и соответствующий API отражения для получения информации о классе.
концепция отражения
Отражение — это инструмент для получения и изменения поведения приложения во время выполнения. Мое личное понимание состоит в том, что новое — это опережающая операция, зная, что произойдет в существующей системе. Рефлексия обратная, я не знаю, какие классы могут понадобиться в системе, полностью уточнив имя класса, он отражается, когда это необходимо, и внутреннюю информацию о классе можно получить через рефлексию. При разработке фреймворка Java относительно распространено использование технологии отражения.
Преимущества и недостатки отражения
преимущество
- Мощная расширяемость, пользователи могут использовать классы, определенные извне, с помощью полных имен классов.
- Помогает инструментам разработки IDE получать информацию о коде, разрабатываемом пользователем, и предлагает написать более правильный код.
- Инструментам отладки полезно получать информацию о времени выполнения и использовать тестовые среды, такие как Junit.
недостаток
- влияют на производительность. Поскольку отражение должно динамически разрешать информацию о классе, оно работает медленнее, чем методы без отражения.
- Есть требования к безопасной среде. Для отражения требуются определенные разрешения во время выполнения, которых может не быть в конкретной среде безопасности.
- Открытие внутренней упаковки может вызвать некоторые негативные последствия. Например, частные методы, которые не должны вызываться извне, вызываются через отражение.
Получить информацию о классе через отражение
В Java помимо примитивных типов есть ссылочные типы. boolean, int, long, float и т. д. являются основными типами java.lang.String, Java.io.Serializable — это ссылочный тип
получить java.lang.Class
Для каждого типа Java предоставляет класс java.lang.Class для получения информации об атрибутах и методах класса среды выполнения. В то же время java.lang.Class также можно использовать для создания классов и объектов. Если это объектный тип, вы можете получить класс Class с помощью метода getClass(), предоставляемого родительским классом верхнего уровня Object.
"apple".getClass();
Если это базовый тип или общий класс, вы можете использовать метод .class для получения класса Class следующим образом.
int.class;
java.io.PrintStream.class;
После получения полного имени класса вы можете создать класс с помощью Class.forName следующим образом.
Class c = Class.forName("com.coderising.kailuncen.Main");
Получить связанную информацию о классе для класса
Следующие API можно использовать для получения связанной информации о классе класса. Получите информацию о родительском классе класса:
Class.getSuperclass()
Получить информацию о классе-члене класса, за исключением частных:
Class.getClasses()
Получить всю информацию о классе-члене класса, включая частные:
Class.getDeclaredClasses()
Следующий API может возвращать информацию о классе класса, в котором объявлены эти переменные-члены.
Class.getDeclaringClass()
java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()
Если этот класс является анонимным классом, информацию о классе, содержащем его, можно получить с помощью следующего API.
Class.getEnclosingClass()
получить модификатор класса
Классы могут быть украшены различными модификаторами во время выполнения следующим образом. Квалификаторы доступа: общедоступный, защищенный и частный. Модификаторы, требующие переопределения: абстрактные. Затем статические, окончательные, аннотации и т. д. API отражения может использовать следующие методы для доступа к ним.
Class.getModifiers()
Class.getAnnotations();
Получить информацию о членах класса
В учебнике Oracle организованы три таблицы, чтобы показать, как получить информацию о членах класса.