С момента введения аннотаций в версии Java 5.0 она стала очень важной частью платформы Java. В процессе разработки мы часто видим такие аннотации, как @Override и @Deprecated в коде приложения. В этой статье я расскажу вам, что такое аннотации, почему они должны быть представлены, как работают аннотации, как писать пользовательские аннотации (с помощью примеров), и при каких обстоятельствах вы можете использовать аннотации, а также последние аннотации и ADF (структура разработки приложений). Это займет немного времени, поэтому приготовьте себе чашку кофе и позвольте нам войти в мир аннотации.
Что такое аннотация?
Одно слово может описывать аннотации, то есть метаданные, то есть данные, которые описывают данные. Следовательно, можно сказать, что аннотация является метаданным исходного кода. Например, следующий код:
@OverridePublic String toString () {return "Это строка представление текущего объекта.";}В приведенном выше коде я переписываю метод ToString () и использую аннотацию @Override. Однако, даже если я не использую аннотацию @Override для обозначения кода, программа может нормально выполняться. Итак, что означает аннотация? Есть ли выгода для написания таким образом? Фактически, @Override сообщает компилятору, что этот метод является методом переписывания (метаданные, описывающие метод). Если метод не существует в родительском классе, компилятор сообщит об ошибке, что заявляет, что метод не переписывает метод в родительском классе. Если я случайно написал неправильную опечатку, например, напишите ToString () как toString () {Double R}, и я не использую аннотацию @Override, программа все еще может быть составлена и запускана. Но результаты операции будут сильно отличаться от того, что я ожидал. Теперь мы понимаем, что такое аннотации, и использование аннотаций помогает прочитать программу.
Аннотация - это специальный модификатор, применяемый к классам, методам, параметрам, переменным, конструкторам и объявлениям пакетов. Это инструмент, выбранный стандартом JSR-175 для описания метаданных.
Зачем вводить аннотации?
До (или даже после использования) XML широко используется для описания метаданных. Некоторые разработчики приложений и архитекторы начали обнаруживать, что обслуживание XML становится все хуже и хуже. Они хотят использовать что -то тесно связанное с кодом, а не описание кода, которое слабо связано с кодом (а в некоторых случаях даже полностью отдельно), как XML. Если вы ищете «XML против аннотаций» в Google, вы увидите много дебатов по этому вопросу. Самое интересное, что конфигурация XML фактически введена в отдельный код и конфигурацию. Вышеупомянутые два просмотра могут сбить вас с толку. Оба взгляда, кажется, образуют цикл, но у каждого есть свои плюсы и минусы. Давайте используем пример, чтобы понять разницу между ними.
Если вы хотите установить много констант или параметров для вашего приложения, XML в этом случае является хорошим выбором, потому что он не будет подключен к конкретному коду. Если вы хотите объявить метод как услугу, было бы лучше использовать аннотацию, потому что в этом случае аннотации и методы должны быть тесно связаны, и разработчики должны это распознать.
Другим важным фактором является то, что аннотация определяет стандартный способ описания метаданных. До этого разработчики обычно определяют метаданные по -своему. Например, используйте тегированные интерфейсы, аннотации, переходные ключевые слова и так далее. Каждый программист определяет метаданные по -своему, в отличие от стандартного пути аннотации.
В настоящее время многие рамки используют XML и аннотацию в комбинации, чтобы сбалансировать плюсы и минусы между ними.
Как работает аннотация? Как написать пользовательскую аннотацию?
Прежде чем сообщить об этой части, мы рекомендуем вам сначала загрузить пример кодовых аннотаций. После загрузки поместите его в IDE, для которого вы привыкли использовать. Эти коды помогут вам лучше понять механизм аннотации.
Написание аннотации очень проста, вы можете сравнить определение аннотации с определением интерфейса. Давайте посмотрим на два примера: один-стандартная аннотация @Override, а другой-пользовательская аннотация @Todo.
@Target (elementType.method) @retention (armentpolicy.source) public @Interface override {}У вас могут быть несколько вопросов об аннотации @Override, он ничего не делает, так как это проверяет, что в родительском классе есть функция с тем же именем? Конечно, не удивляйтесь, я просто дразню вас. Определение аннотации @Override - это не просто небольшой код. Эта часть контента очень важна, я должен повторить его снова: аннотации - это просто метаданные и не имеют ничего общего с бизнес -логикой. Это немного сложно понять, но это все. Если аннотации не содержат бизнес -логики, кто -то должен их реализовать. Пользователи метаданных делают это. Аннотации предоставляют только информацию о свойствах, которые он определяет (класс/метод/пакет/домен). Пользователи аннотаций (опять же, какой -то код) прочитают эту информацию и реализуют необходимую логику.
Когда мы используем аннотации Java (например, @Override), JVM - это пользователь, который работает на уровне байт -кода. На этом этапе разработчики приложений не могут контролировать или использовать пользовательские аннотации. Итак, давайте объясним, как написать пользовательские аннотации.
Давайте поговорим о ключевых моментах написания пользовательских аннотаций один за другим. В приведенном выше примере вы видите некоторые аннотации, применяемые к аннотациям.
Версия J2SE5.0 предоставляет четыре вида мета -аннотаций в java.lang.annotation, которые специально аннотирует другие аннотации:
@Documents Простая аннотация метки аннотаций, указывающая, добавляется ли информация о аннотации в документ Java.
@Retention определяет жизненный цикл этой аннотации.
Harementpolicy.source отбрасывается во время фазы компиляции. Эти аннотации больше не имеют никакого значения после компиляции, поэтому они не пишут байт -код. @Override, @suppresswarnings - все это принадлежит этому типу аннотации.
Harementpolicy.class отбрасывается при загрузке класса. Полезно при обработке файлов Bytecode. Это метод по умолчанию для аннотаций.
HarementPolicy.Runtime никогда не отбрасывается, а аннотация сохраняется во время выполнения, поэтому информацию об аннотации можно читать с использованием механизма отражения. Наши пользовательские аннотации обычно используются таким образом.
@Target показывает, где используется эта аннотация. Если не указано, аннотация может быть размещена где угодно. Вот некоторые из доступных параметров. Следует отметить, что аннотация атрибутов совместима. Если вы хотите добавить аннотацию ко всем 7 атрибутам и исключите только один атрибут, вам необходимо определить цель, чтобы включить все атрибуты.
@INHEDED определяет взаимосвязь между этой аннотацией и подклассами
Итак, как внутреннее определение аннотаций? Аннотации поддерживают только основные типы, строки и перечисления. Все атрибуты в комментарии определяются как методы и позволяют предоставлять значения по умолчанию.
@Target (elementType.method) @retention (armentpolicy.runtime) @Interface toDo {public enum priority {low, medium, high} public enum status {not_started} string Автор () по умолчанию "yash"; приоритет приоритет () dofit afforts.low; status () seffist nefast not_start not_start notattrated; Следующий пример демонстрирует, как использовать вышеуказанные аннотации.
@Todo (priority = todo.priority.medium, author = "yashwant", status = todo.status.started) public void incoMpletemethod1 () {// Написана какая -то бизнес -логика //, но она еще не завершена} Если в аннотации есть только один атрибут, его можно назвать непосредственно «значение», и при его использовании не нужно указывать имя атрибута.
@Interface author {string value ();}@author ("yashwant") public void somemethod () {} Но пока все выглядит довольно хорошо. Мы определяем наши собственные аннотации и применяем их к методам бизнес -логики. Теперь нам нужно написать пользовательскую программу, чтобы позвонить на нашу аннотацию. Здесь нам нужно использовать механизм отражения. Если вы знакомы с кодом отражения, вы узнаете, что отражение может предоставить имена классов, методы и объекты переменных экземпляров. Все эти объекты имеют метод Getannotation () для возврата информации аннотации. Нам нужно преобразовать этот объект в наш пользовательский комментарий (после проверки с exactionof ()), и мы также можем вызвать методы в пользовательском комментарии. Посмотрите на следующий пример кода, используя приведенную выше аннотацию:
Class BusinessLogicClass = businessLogic.class; for (метод метода: businesslogclass.getmethods ()) {todo todoannotation = (todo) method.getannotation (todo.class); if (todoannotation! : « + toDoannotation.Author ()); System.out.println (" Приоритет: " + toDoannotation.priority ()); System.out.println (" status: " + toDoannotation.status ());}}Аннотация вариантов использования
Функции аннотаций очень мощные, а рамки, такие как Spring и Hebernate, используют аннотации в регистрации и достоверности. Аннотации могут применяться там, где используются маркерные интерфейсы. Разница в том, что интерфейс TAG используется для определения полного класса, но вы можете определить комментарии для одного метода, например, выставлять метод в качестве услуги.
Многие новые аннотации были введены в последнем сервлете 3.0, особенно связанных с безопасностью сервлета.
Handlestypes Эта аннотация используется для представления набора классов приложений, передаваемых в ServletContainerInitializer.
Httpconstraint Эта аннотация представляет ограничения безопасности для запросов применения всех методов HTTP и отличается от ограничений безопасности HTTPMethodConstraint, определенных в аннотации сервиса.
Httpmethodconstraint указывает ограничения безопасности для различных типов запросов, которые отличаются от аннотации, которая описывает тип метода протокола HTTP в аннотации сервлета.
MultipartConfig Эта аннотация отмечена на сервлете, что указывает на то, что тип MIME запроса, который сервлет хочет обрабатывать, является многоуточным/форм-датом.
Сервлета.
WebFilter используется для объявления серверного фильтра;
WebInitParam Эта аннотация используется для объявления параметров инициализации в сервлете или фильтре и обычно используется с @Webservlet или @WebFilter.
Weblistener Это аннотация - это другой тип прослушивателя объявлений событий в контексте веб -приложения.
Webservlet Эта аннотация используется для объявления конфигурации сервлета.
ADF (прикладная структура) и аннотации
Теперь мы начинаем обсуждать последнюю часть статьи. Структура приложения, известная как ADF, разработана Oracle для создания Oracle Converge Applications. Мы поняли преимущества и недостатки аннотаций и знаем, как писать пользовательские аннотации, но куда мы должны применять аннотации? Предоставляет ли ADF некоторые простые аннотации? Хороший вопрос, действительно, есть некоторые ограничения при использовании аннотаций в ADF. Ранее упомянутые рамки приложения, такие как Spring и Hibernate, используют AOP (побочное программирование). В AOP структура обеспечивает механизм для введения кода в предварительную обработку и последующую обработку событий. Например: у вас есть крючок для добавления кода до и после выполнения метода, поэтому вы можете написать свой пользовательский код в этих местах. ADF не использует AOP. Если у нас есть какие -либо варианты использования для аннотации, нам может потребоваться реализовать его через наследство.
Я надеюсь, что вам понравится эта статья, чтобы помочь вам лучше понять смысл аннотации!