Як і де застосовуються анотації на Java?


218

Які основні сфери ми можемо використовувати Анотації? Чи є заміною цієї функції конфігурація на основі XML?


2
cdb, я не впевнений, що ви повністю розумієте щедрості - у вас тут є дуже багато хороших відповідей, і без жодних роз'яснень того, чого їм не вистачає, або що ви конкретно шукаєте, ви додали щедрості. (Ви також зробили це тут: stackoverflow.com/questions/1746550 / ... )
delfuego

5
Гаразд, я знаю, що це дуже давно, але @delfuego: якщо ви збираєтесь сказати ОП, що він неправильно використовує щедрості, це може допомогти продовжити, також пояснивши, як правильно їх використовувати .
Попс

Відповіді:


308

Анотації - це мета-мета-об'єкти, які можна використовувати для опису інших мета-об'єктів . Метаоб'єкти - це класи, поля та методи. Запитати об'єкт за його мета-об'єктом (наприклад anObj.getClass()) називається самоаналіз . Самоаналіз може піти далі, і ми можемо запитати мета-об’єкт, які його анотації (наприклад aClass.getAnnotations). Інтроспекція та анотації належать до того, що називається рефлексією та метапрограмуванням .

Анотацію потрібно трактувати так чи інакше, щоб бути корисною. Анотації можуть бути інтерпретовані під час розробки IDE або компілятором, або під час виконання рамками.

Обробка анотацій є дуже потужним механізмом і може використовуватися у багатьох різних способах:

  • описати обмеження або використання елемента: наприклад @Deprecated, @Override, або@NotNull
  • описати "природу" елемента, напр @Entity, @TestCase, @WebService
  • описати поведінку елемента: @Statefull, @Transaction
  • описати, як обробити елемент: @Column, @XmlElement

У всіх випадках для опису елемента та уточнення його значення використовується анотація .

До JDK5 інформація, яка зараз виражається зауваженнями, необхідна для зберігання в іншому місці, а XML-файли часто використовувалися. Але зручніше використовувати анотації, оскільки вони будуть належати до самого коду Java, а отже, набагато простіше маніпулювати, ніж XML.

Використання приміток:

  • Документація, наприклад XDoclet
  • Компіляція
  • ІДЕ
  • Рамка для тестування, наприклад, JUnit
  • IoC контейнер, наприклад, як Spring
  • Серіалізація, наприклад XML
  • Програмно-орієнтоване програмування (AOP), наприклад Spring AOP
  • Сервери прикладних програм, наприклад контейнер EJB, веб-сервіс
  • Об'єктно-реляційне відображення (ORM), наприклад, сплячий режим, JPA
  • і багато іншого...

... подивіться, наприклад, проект Lombok , який використовує анотації для визначення способів генерації equalsчи hashCodeметодів.


50

Існують безглузді програми для анотацій Java. Перш за все, вони можуть використовуватися компілятором (або розширеннями компілятора). Розглянемо для прикладу замітку на заміщення :

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

Цей фактично вбудований в JDK Java. Компілятор подасть сигнал про помилку, якщо якийсь метод позначений ним, який не перекриває метод, успадкований від базового класу. Ця примітка може бути корисною, щоб уникнути поширеної помилки, коли ви насправді маєте намір замінити метод, але не зробите цього, оскільки підпис, наданий у вашому методі, не відповідає підписуванню методу, який перекрито:

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

Станом на JDK7, анотації дозволені на будь-якому типі. Ця функція тепер може використовуватися для анотацій компілятора, таких як NotNull , як у:

public void processSomething(@NotNull String text) {
    ...
}

що дозволяє компілятору попередити вас про неправильне / перевірене використання змінних та нульових значень.

Ще одна вдосконалена програма для анотацій включає рефлексію та обробку анотацій під час виконання. Це (я думаю) те, що ви мали на увазі, коли ви говорите про примітки як про «заміну конфігурації на основі XML». Це вид обробки анотацій, який використовується, наприклад, різними рамками та стандартами JCP (стійкість, введення залежності, ви їх називаєте), щоб забезпечити необхідну метадані та інформацію про конфігурацію.


18

Анотації - це форма метаданих (даних про дані), доданих до вихідного файлу Java. Вони в значній мірі використовуються рамками для спрощення інтеграції клієнтського коду. Кілька реальних прикладів у верхній частині моєї голови:

  • JUnit 4 - ви додаєте @Testпримітку до кожного методу тестування, для якого потрібно виконати бігун JUnit. Також є додаткові примітки щодо налаштування тестування (як @Beforeі @BeforeClass). Все це обробляється бігуном JUnit, який відповідно виконує тести. Можна сказати, що це заміна конфігурації XML, але анотації іноді є більш потужними (наприклад, вони можуть використовувати відображення), а також вони ближче до коду, на який вони посилаються ( @Testанотація є безпосередньо перед методом тестування, тому мета цей метод зрозумілий - він також є документацією). Конфігурація XML, з іншого боку, може бути більш складною і може включати набагато більше даних, ніж анотації.

  • Terracotta - використовує як анотації, так і файли конфігурації XML. Наприклад, @Rootанотація повідомляє програмі Terracotta про те, що анотоване поле є коренем, і його пам’ять має бути поділена між екземплярами VM. Файл конфігурації XML використовується для налаштування сервера та підкаже, які класи інструменту.

  • Google Guice - прикладом може бути @Injectпримітка, яка при застосуванні до конструктора змушує час виконання Guice шукати значення для кожного параметра на основі визначених форсунок. @InjectАнотацій буде досить важко відтворити з допомогою конфігураційних файлів XML, а також його близькості до конструктору він посилається на вельми корисно (уявіть собі, шукати в величезний файл XML , щоб знайти всі ін'єкції залежностей , які ви встановили).

Сподіваюся, я розповів вам про те, як анотації використовуються в різних рамках.


12

Анотації на Java містять значення для опису класів, полів та методів. По суті, це форма метаданих, доданих до вихідного файлу Java, вони не можуть впливати безпосередньо на семантику програми. Однак анотації можна читати під час виконання за допомогою Reflection, і цей процес відомий як Introspection. Тоді його можна було б використовувати для зміни класів, полів чи методів.

Цю функцію часто використовують Бібліотеки та SDK (сплячий режим, JUnit, Spring Framework) для спрощення або зменшення кількості коду, який програміст не зробив би, якщо це не зробить більше для роботи з цими Бібліотеками або SDK. Тому справедливо сказати Анотації та Відображення робота рука об руку на Java.

Ми також можемо обмежити доступність примітки до часу компіляції або часу виконання. Нижче - простий приклад створення власної анотації

Водій.java

package io.hamzeen;

import java.lang.annotation.Annotation;

public class Driver {

    public static void main(String[] args) {
        Class<TestAlpha> obj = TestAlpha.class;
        if (obj.isAnnotationPresent(IssueInfo.class)) {

            Annotation annotation = obj.getAnnotation(IssueInfo.class);
            IssueInfo testerInfo = (IssueInfo) annotation;

            System.out.printf("%nType: %s", testerInfo.type());
            System.out.printf("%nReporter: %s", testerInfo.reporter());
            System.out.printf("%nCreated On: %s%n%n",
                    testerInfo.created());
        }
    }
}

TestAlpha.java

package io.hamzeen;

import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {

}

IssueInfo.java

package io.hamzeen;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Hamzeen. H.
 * @created 10/01/2015
 * 
 * IssueInfo annotation definition
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {

    public enum Type {
        BUG, IMPROVEMENT, FEATURE
    }

    Type type() default Type.BUG;

    String reporter() default "Vimesh";

    String created() default "10/01/2015";
}

6

Це заміна конфігурації на основі XML?

Не повністю, але конфігурація, яка відповідає структурам коду (наприклад, відображення JPA або ін'єкція залежності навесні), часто може бути замінена анотаціями, і зазвичай зазвичай набагато менш багатослівна, дратівлива і болісна. Практично всі помітні рамки зробили цей перемикач, хоча стара конфігурація XML зазвичай залишається опцією.


Нібито анотації можуть повністю усунути XML-файл з конфігурацією обличчя для JSF. Набігав на цю посаду, намагаючись дізнатися, як це зробити ...
Брайан Ноблеуч,

6

Є 2 перегляди анотацій

  1. Перегляд користувача, більшість часу анотації працюють як ярлик, економлять ключові обведення або роблять вашу програму більш читаною

  2. подання постачальника, погляди процесора на анотацію більше "легкого зваженого" інтерфейсу ", ваша програма НЕЧАСНА, але не чітко" реалізує "конкретний інтерфейс (тут він називається анотацією)

наприклад, у jpa ви визначаєте щось на кшталт

@Entity class Foo {...}

замість

class Foo implements Entity {...}

обидва говорять те саме: "Foo - це клас сутності"


3

Де можна використовувати анотації

Анотації можуть застосовуватися до декларацій: декларацій класів, полів, методів та інших програмних елементів. При використанні в декларації кожна анотація часто з'являється, за умовою, у власному рядку.

Оновлення Java SE 8: примітки також можна застосовувати до використання типів. Ось кілька прикладів:

  • Вираз створення екземпляра класу:

    новий @Interned MyObject ();

  • Тип ролях:

    myString = (@NonNull String) str;

  • реалізує пункт:

    клас UnmodifiableList реалізує @Readonly List <@Readonly T> {...}

  • Викинута декларація про виключення:

    void monitorTemperature () кидає @Critical TemperatureException {...}


2

Такі рамки, як Hibernate, мали багато конфігурації / картографування.

Ознайомтеся з анотаціями зі сплячки


1
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Рохіт Гупта

2

JPA (від Java EE 5) - чудовий приклад (над) використання анотацій. Java EE 6 також представить анотації у багатьох нових областях, таких як RESTful веб-сервіси та нові анотації для кожного доброго старого API сервлетів.

Ось кілька ресурсів:

Це не / лише конфігурація конфігурації, яка повинна / може бути перейнята анотаціями, але вони також можуть бути використані для контролю поведінки. Це ви бачите ще в прикладах JAX-RS Java EE 6.


1

Це корисно для коментування ваших класів на рівні методу, класу чи поля, щось про той клас, який не зовсім пов'язаний з класом.

Ви можете мати свої примітки, які використовуються для позначення певних класів лише для тестового використання. Це може бути просто для цілей документації, або ви можете застосувати його, відфільтрувавши його під час компіляції кандидата на випуск.

Ви можете використовувати примітки для зберігання деяких метаданих, наприклад, у рамках плагіна, наприклад, імені плагіна.

Це просто ще один інструмент, він має багато цілей.


1

Він додає додаткову інформацію про код шляхом (a) перевірки компілятора або (b) аналізу коду

**

  • Далі наведені вбудовані анотації :: 2 типи

**

Тип 1) Анотації, застосовані до коду Java:

@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method
Public doSomething()....

@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})

Тип 2) Анотації, застосовані до інших приміток:

@Retention - Specifies how the marked annotation is storedWhether in code only, compiled into the class, or available at run-time through reflection.

@Documented - Marks another annotation for inclusion in the documentation.

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).

**

  • Спеціальні примітки ::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


ДЛЯ НАЙКРАЩОГО ПОВІДОМЛЕННЯ ПІДТРИМУЙТЕ НИЖИХ ПОСИЛАННЯ: РОБОТИ З ПРИКЛАДАМИ


http://www.javabeat.net/2007/08/annotations-in-java-5-0/


0

Анотації можна використовувати як альтернативу зовнішнім файлам конфігурації, але не можна вважати повноцінною заміною. Ви можете знайти безліч прикладів, коли для заміни файлів конфігурації використовувались аннотації, такі як Hibernate, JPA, EJB 3 та майже всі технології, включені в Java EE.

У будь-якому випадку це не завжди вдалий вибір. Метою використання файлів конфігурації зазвичай є відокремлення коду від деталей середовища, де працює програма. У таких ситуаціях, і в основному, коли конфігурація використовується для зіставлення програми до структури зовнішньої системи, анотація не є гарною заміною файлу конфігурації, оскільки вони дозволяють включити деталі зовнішньої системи всередині вихідного коду ваша заявка. Тут зовнішні файли слід вважати найкращим вибором, інакше вам потрібно буде змінювати вихідний код і перекомпілювати щоразу, коли ви змінюєте відповідну деталь у середовищі виконання.

Анотації набагато більше підходять для прикраси вихідного коду додатковою інформацією, яка доручає засобам обробки, як під час компіляції, так і під час виконання, спеціальним чином обробляти класи та структури класів. @Overrideі JUnit @Testє хорошими прикладами такого використання, вже детально пояснених в інших відповідях.

Зрештою, правило завжди одне і те ж: зберігайте всередині джерела речі, які змінюються з джерелом, і зберігайте поза джерелом речі, які змінюються незалежно від джерела.


0

Java EE 5 надає перевагу використанню приміток над конфігурацією XML. Наприклад, у EJB3 атрибути транзакцій методу EJB задаються за допомогою приміток. Вони навіть використовують анотації для позначення POJO як EJB та для визначення конкретних методів як методів життєвого циклу, а не для того, щоб вимагати такої реалізації інтерфейсу.


0

Мета анотації на Java - просто пов’язати інформацію з елементами, що коментується програмою. Анотації на Java можуть використовуватися як модифікатори в будь-якій декларації, будь то пакет, клас (включаючи перерахунки), інтерфейс (включаючи типи анотацій), поле, метод, формальний параметр, конструктор або локальна змінна.

Анотації на Java також можуть використовуватися на константах перерахунків. Такі примітки розміщуються безпосередньо перед постійною перерахунком, яку вони коментують. Анотації на Java умовно розміщуються перед усіма іншими модифікаторами, але це не є вимогою; вони можуть вільно змішуватися з іншими модифікаторами.

Детально читайте на анотаціях Java .


0

Нижче наведено деякі місця, де можна використовувати примітки.

a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations

Ви можете ознайомитись із цим посиланням для отримання детальної інформації про примітки.

Ви можете перейти за цим посиланням, щоб побачити, як анотації використовуються для створення простого тестового набору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.