Рубрики
Без рубрики

Аннотации на Java

Что такое Аннотации? Аннотации содержат вспомогательную информацию о программе. Его можно прикрепить… С тегами java, информатика, программирование.

Что такое Аннотации? Аннотации содержат вспомогательную информацию о программе. Он может быть присоединен к классам, интерфейсам, методам, конструкторам для предоставления дополнительной информации, которая полезна для компиляторов JVM и java. Это не влияет на выполнение кода. Впервые он был реализован в Java 5. Они начинаются с “@”.

Аннотации Java подразделяются на:

  • Встроенные аннотации

Java предоставляет некоторые встроенные аннотации, импортированные из java.lang:

1) @Переопределение:

class Shape{  
    void findArea(){
        System.out.println("finding area");
    }  
}  

    class Square extends Shape{  
        @Override  
        void findArea(){
            System.out.println("finding area of a square");

        }
    }  

    class Main{  
        public static void main(String args[]){  
        Shape sh = new Square();  
        sh.findArea();  
    }
}  

Выход:

finding area of a square

2) @Подавлять предупреждения:

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

Вот демонстрационная версия:

import java.util.*;  
class Main{  
    @SuppressWarnings("unchecked")  
    public static void main(String args[]){  
        ArrayList arr=new ArrayList();  
        arr.add("abc");  
        arr.add("def");  
        arr.add("ghi");  

        for(Object obj:arr)  
        System.out.println(obj);  
    }
}  

Если мы удалим аннотацию SuppressWarnings, компилятор сгенерирует предупреждение о том, что”Main.java использует непроверенные или небезопасные операции”, потому что мы не указали тип списка массивов, поскольку они являются общими по своей природе.

3) @Устарело: В этой аннотации указано, что отмеченный элемент больше нельзя использовать. Если элемент используется, то компилятор сгенерирует предупреждение для того же самого. Он используется для сообщения о том, что устаревшие методы больше не могут использоваться в будущих версиях.

Вот демонстрационная версия:

class Base{  
    void non_deprecated(){
        System.out.println("hello m");
    }   
    @Deprecated  
    void deprecated(){
        System.out.println("hello n");
    }  
}   
class Main{  
    public static void main(String args[]){  
    Base obj = new Base();  
    obj.deprecated();  
    }
}  

Выход:

Main.java uses or overrides a deprecated API.

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

Он также предоставляет четыре встроенных аннотации из java.lang.аннотации, эти встроенные аннотации используются в пользовательских аннотациях, также известных как мета-аннотации.

1) @Удержание:

Он определяет, как долго будет использоваться аннотация. Он имеет следующие опции:

Политика удержания. КЛАСС : сохраняется компилятором и игнорируется JVM. Политика удержания. ИСТОЧНИК : сохраняется на уровне исходного кода и игнорируется компилятором Политика удержания. СРЕДА ВЫПОЛНЕНИЯ : сохраняется виртуальной виртуальной машиной и используется в среде выполнения .

((Политика хранения – это параметр аннотации @Retention .)

2) @Документированный:

В нем указывается, что помеченный элемент должен быть задокументирован JavaDoc. Например:

import java.lang.annotation.*;

@Documented
@interface Example {

   // Annotation element definitions

}

Это приведет к появлению информации в @Example для JavaDocs.

3) @Цель: Он указывает, где должна использоваться аннотация. Например. если тип указан как ТИП, то аннотация должна использоваться в классе или интерфейсе.

Для аннотации существуют следующие целевые значения:

Тип элемента. МЕТОД для методов ElementType. ПАКЕТ для типа элемента пакетов. ПАРАМЕТР для типа элемента параметров. ТИП для класса, тип элемента интерфейса. ANNOTATION_TYPE для типа элемента типа аннотации. КОНСТРУКТОР для конструкторов ElementType. LOCAL_VARIABLE для типа элемента локальных переменных. ПОЛЕ для полей

Код:

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})  
@interface AnnotationExample{  
    int value_1();  
    String value_2();  
}  

Приведенный выше код определяет аннотацию для класса, полей и методов.

4) @Унаследовано: Он указывает, что отмеченный элемент может быть унаследован от суперкласса.

Код:

java.lang.annotation.Inherited

@Inherited
public @interface AnnotationExample {

}
@AnnotationExample
public class Base { 
  //Base class body
}
public class Child extends Base { 
   //Child class body
}

Здесь в качестве базы класса используется аннотация @AnnotationExample, которая помечена @унаследованной аннотацией. Это означает, что дочерний элемент подкласса наследует пример @AnnotationExample.

Некоторые аннотации были введены в Java 9, вот список ниже: 1) @ Повторяемый: Он появился в Java SE 8 и означает, что отмеченная аннотация может использоваться более одного раза для одного и того же объявления или типа.

Предположим, вы хотите, чтобы аннотация повторялась, как в приведенном ниже примере:

@interface Month {
  String name();
}
@Month(name = "january")
@Month(name = "march")
@Month(name = "june")
@Month(name = "october")//@Month annotation repeated 4 times
class Birthday {
}

До Java 7 такого рода программы выдавали ошибку, но с Java 8 была принята концепция повторяющейся аннотации, но есть определенный способ ее достижения.

Давайте посмотрим, как:

import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
 @Repeatable(Months.class)
 @interface Month {
   String name();
 }
 @Retention(RetentionPolicy.RUNTIME)
 @interface Months {
   Month[] value();
 }
 @Month(name = "january") @Month(name = "march") @Month(name = "june") @Month(name = "october")
 class Birthday {
 }

Здесь приведена аннотация контейнера.

Чтобы использовать приведенные выше примечания, выполните следующие действия:

public class RepeatingAnnotations {
  public static void main(String args[]) {
   Month[] monthArray = Birthday.class.getAnnotationsByType(Month.class);
   for (Month month : monthArray) {
    System.out.println(month.name());
   }
  }
 }

Выход:

january
march
june
october

2) @SafeVarargs: Эта аннотация была введена в Java 7, а дополнительные функции появились в Java 9. Его можно использовать с конечными методами, конструкторами, статическими методами и методами частного экземпляра. Эта аннотация гарантирует, что метод не выполняет никаких небезопасных операций со своими параметрами varargs. Одна важная особенность этой аннотации заключается в том, что она не может быть применена к переопределенным методам, но может быть применена в противном случае.

3) @Функциональный интерфейс: Эта аннотация была введена в Java 8. Он допускает только один абстрактный метод внутри них, благодаря этой особенности они также известны как интерфейсы с одним абстрактным методом (интерфейсы SAM). Если это правило будет нарушено, компилятор выдаст ошибку.

Давайте посмотрим на пример:

@FunctionalInterface
interface Rectangle 
{ 
    int calc_area(int x, int y); 
} 

class Main 
{ 
    public static void main(String args[]) 
    { 
        int a = 5; 
        int b = 6;


        // lambda expression to define the calculate method 
        Rectangle r = (int x, int y)->x*y; 

        // parameter passed and return type must be 
        // same as defined in the prototype 
        int result = r.calc_area(a,b); 
        System.out.println(result); 
    } 
} 

Выход:

30

Пользовательские аннотации

Вы можете создавать собственные аннотации, используя @интерфейс вместе с именем аннотации. Эти аннотации могут содержать элементы, но не должны содержать реализацию этих элементов. @Документированный , @Унаследованный , @Целевой , @Сохранение – вот некоторые из аннотаций, которые используются с пользовательскими аннотациями.

Вот пример:

import java.util.ArrayList;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;



@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

@interface CustomAnnotation{
    String name();
    int emp_id();
}

@CustomAnnotation(name="John",emp_id=101)
class Employee{
    String dept_name;
    int dept_id;

    public Employee(String dept_name, int dept_id){
        super();
        this.dept_name = dept_name;
        this.dept_id = dept_id;
    }
}

public class Main{
    public static void main(String[] args){
        Employee obj = new Employee("IT", 111);

        Class c = obj.getClass();
        Annotation an = c.getAnnotation(CustomAnnotation.class);
        CustomAnnotation ca = (CustomAnnotation)an;
        System.out.println(ca.name());

    }
}

Каковы типы аннотаций Java?

Вот типы аннотаций: 1) Примечания к маркерам: Аннотации, не имеющие методов, являются аннотациями маркеров, например: @Override и @устаревший .

@interface AnnotationExample { }

2) Однозначные аннотации: Аннотации, имеющие один метод, являются однозначными аннотациями, вот пример:

@interface AnnotationExample {
    int item();
}

Если вы хотите указать значение по умолчанию, то,

@interface AnnotationExample {
    int item() default 100;
}

3) Многозначные аннотации: Аннотации, имеющие более одного метода, являются многозначными аннотациями,

вот пример:

@interface AnnotationExample {
    int item1();
    int item2();
    String item3();
}
@interface AnnotationExample {
    int item1() default 1;
    int item2() default "abc";
    String item3() default "Hello";
}

Часто задаваемые вопросы для интервью по аннотации Java

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

1. Что такое мета-аннотации в java, перечислите некоторые из них?

Мета-аннотации – это аннотации, которые применяются к другим аннотациям. Ниже приведен список мета-аннотаций в Java: @Документировано @Сохранение @Унаследовано @Цель

2. Каков родительский класс класса аннотаций?

Объект

3. Каково имя пакета для класса аннотаций?

Каково имя пакета для класса аннотаций?

4. Почему используются аннотации?

Они используются для передачи определенных инструкций компилятору.

5. Каковы типичные варианты использования аннотаций?

Информация для компилятора – с помощью аннотаций компилятор может обнаруживать ошибки или подавлять предупреждения.

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

6. Какие типы объектов могут быть возвращены из объявления аннотации метода?

Возвращаемый тип должен быть примитивом, строкой, классом, перечислением или массивом одного из предыдущих типов. В противном случае компилятор выдаст ошибку.

7. Можно ли расширить аннотации?

Нет. Аннотации всегда расширяют java.lang.аннотации. Аннотация, как указано в спецификации языка Java. Если мы попытаемся использовать предложение extends в объявлении аннотации, мы получим ошибку компиляции.

8. Назовите 5 предопределенных аннотаций на Java. @Подавлять предупреждения @Устарел @@Переопределение @Параметры безопасности @Функциональный интерфейс

Оригинал: “https://dev.to/soniajm/annotations-in-java-2og5”