Java аннотациясы - Википедия - Java annotation

Ішінде Java компьютерлік бағдарламалау тілі, an аннотация синтаксистік формасы болып табылады метадеректер Java-ға қосуға болады бастапқы код.[1] Сабақтар, әдістер, айнымалылар, параметрлері және Java пакеттері түсініктеме берілуі мүмкін. Ұнайды Джавадок тегтер, Java аннотацияларын бастапқы файлдардан оқуға болады. Айырмашылығы жоқ Джавадок тегтер, Java аннотацияларын ендіруге және оқуға болады Java сынып файлдары арқылы жасалған Java компиляторы. Бұл аңдатпаларды Java виртуалды машинасы кезінде жұмыс уақыты арқылы оқыңыз шағылысу.[2] Java-да бар мета-аннотациялар жасауға болады.[3]

Тарих

The Java платформасы әртүрлі осы жағдай үшін аннотация механизмдері - мысалы өтпелі модификатор немесе @deprecated javadoc тэгі. The Java сипаттамасына сұраныс JSR-175 жалпы мақсаттағы аннотацияны енгізді (сонымен бірге метадеректер) дейін Java қауымдастық процесі 2002 жылы; ол 2004 жылдың қыркүйегінде мақұлданды.[4]Аннотациялар тілдің өзінде 1.5 нұсқасынан бастап қол жетімді болды Java Development Kit (JDK). The орынды құрал JDK 1.5 нұсқасында компиляция-уақыттағы аннотацияны өңдеуге арналған уақытша интерфейсті ұсынды; JSR-269 мұны рәсімдеді және ол интеграцияланды javac 1.6 нұсқасындағы компилятор.

Кірістірілген аннотациялар

Java тілге ендірілген аннотация жиынтығын анықтайды. Жеті стандартты аннотацияның үшеуі бір бөлігі java.lang, ал қалған төртеуі java.lang.annotation сайтынан импортталады.[5][6]

Java кодына қолданылатын түсіндірмелер:

Басқа аннотацияға қолданылатын аннотациялар («Мета түсіндірмелер» деп те аталады):

  • @Retention - Белгіленген аннотацияның қалай сақталатынын, тек кодта, класқа жинақталғанын немесе рефлексия арқылы жұмыс уақытында қол жетімді екенін анықтайды.
  • @ Құжатталған - құжаттамаға енгізу үшін тағы бір аннотацияны белгілейді.
  • @Target - Аннотацияны қандай Java элементтеріне қолдануға болатындығын шектеу үшін тағы бір аннотацияны белгілейді.
  • @ Мұрагер - Аннотацияланған сыныптың ішкі сыныптарына мұраға қалдырылатын басқа аннотацияны белгілейді (әдепкі бойынша аннотация ішкі сыныптарға мұраланбайды).

Java 7-ден бастап тілге қосымша үш аннотация қосылды.

  • @SafeVarargs - әдісті немесе конструкторды шақыратындардың барлығына арналған ескертулерді а генериктер вараргтар параметр, өйткені Java 7.
  • @FunctionalInterface - деп анықтайды тип декларациясы а болуы керек функционалды интерфейс, Java 8-ден бастап.
  • @ Қайталанатын - Аннотацияны Java 8-ден бастап бір декларацияға бірнеше рет қолдануға болатындығын көрсетеді.

Мысал

Кірістірілген аннотациялар

Бұл мысал @Override аннотация. Ол компиляторға ата-аналық сыныптарды сәйкестендіру әдістерін тексеруді тапсырады. Бұл жағдайда қате пайда болады, себебі gettype () Cat классының әдісі іс жүзінде жоққа шығарылмайды getType () сияқты жануарлар класы қажет, өйткені сәйкес келмейтін жағдай. Егер @Override аннотация болмаған, атаудың жаңа әдісі gettype () мысық класында жасалатын еді.

қоғамдық сынып Жануар {    қоғамдық жарамсыз сөйлеу() {    }    қоғамдық Жол getType() {        қайту «Жалпы жануар»;    }}қоғамдық сынып Мысық ұзарады Жануар {    @Override    қоғамдық жарамсыз сөйлеу() { // Бұл жақсы ауыстыру.        Жүйе.шығу.println(«Мияу.»);    }    @Override    қоғамдық Жол алу типі() { // қате салдарынан компиляция уақыты қатесі: gettype () емес getType () болуы керек.        қайту «Мысық»;    }}

Таңдамалы аннотациялар

Аннотация түрінің декларациясы қалыпты интерфейс декларациясына ұқсас. Белгі (@) интерфейстің алдында тұрады кілт сөз. Әрбір әдіс декларациясы аннотация түрінің элементін анықтайды. Әдіс декларацияларында ешқандай параметрлер немесе лақтыру туралы шарт болмауы керек. Қайтару түрлерімен шектелген примитивтер, Жол, Сынып, энумдар, аннотациялар және массивтер алдыңғы түрлердің Әдістер болуы мүмкін әдепкі мәндер.

  // @Twizzle - бұл ауыстырып қосу () әдісінің аннотациясы.  @Twizzle  қоғамдық жарамсыз ауысу() {  }  // Twizzle аннотациясын жариялайды.  қоғамдық @interface Twizzle {  }

Аннотациялар кілт-мән жұптарының қосымша тізімін қамтуы мүмкін:

  // Сол сияқты: @Edible (мән = шын)  @Edible(шын)  Тармақ элемент = жаңа Сәбіз();  қоғамдық @interface Жеуге жарамды {      логикалық мәні() әдепкі жалған;  }  @Author(бірінші = «Омпа», соңғы = «Лумпа»)  Кітап кітап = жаңа Кітап();  қоғамдық @interface Автор {      Жол бірінші();      Жол соңғы();  }

Аннотациялардың өздері оларды қай жерде және қашан қолдануға болатындығын көрсету үшін түсіндірмеленуі мүмкін:

  @Retention(Сақтау саясаты.RUNTIME) // Осы аннотацияны рефлексия арқылы жұмыс уақытында қол жетімді етіңіз.  @Target({ElementType.ӘДІС})       // Бұл аннотацияны тек класс әдістеріне қолдануға болады.  қоғамдық @interface Пинцет {  }

Компилятор арнайы аннотация жиынтығын сақтайды (соның ішінде @Drecrecated, @Override және @SuppressWarnings) синтаксистік мақсатта.

Аннотацияны көбіне-көп қолданады шеңберлер Сыртқы көзде (мысалы, XML конфигурация файлы сияқты) немесе бағдарламалық түрде (API қоңырауларымен) жариялануы керек пайдаланушы анықтаған сыныптар мен әдістерге мінез-құлықты ыңғайлы қолдану тәсілі ретінде. Төменде, мысалы, түсіндірме берілген JPA деректер класы:

@Entity                                             // Мұны ұйым бұршағы деп жариялайды@Table(аты = «адамдар»)                             // Бұршақты «адамдар» SQL кестесіне бейнелейдіқоғамдық сынып Адам құрал-саймандар Тізбектелген {    @Id                                             // Мұны негізгі кілттер бағанына салыңыз.    @GeneratedValue(стратегия = GenerationType.АВТОМАТТЫ) // Деректер базасында біз емес, жаңа негізгі кілттер пайда болады.    жеке Бүтін идентификатор;    @ Колонна(ұзындығы = 32)                            // Баған мәндерін 32 таңбаға дейін қысқарту.    жеке Жол аты;    қоғамдық Бүтін getId() {        қайту идентификатор;    }    қоғамдық жарамсыз setId(Бүтін идентификатор) {        бұл.идентификатор = идентификатор;    }    қоғамдық Жол getName() {        қайту аты;    }    қоғамдық жарамсыз setName(Жол аты) {        бұл.аты = аты;    }}

Аннотация әдісті шақырулар емес және өздігінен ештеңе істемейді. Керісінше, класс нысаны JPA іске асыру жұмыс уақыты, содан кейін ан жасау үшін аннотациялар шығарылады объектілік-реляциялық картографиялау.

Толық мысал төменде келтірілген:

пакет комнот;импорт java.lang.annotation.құжатталған;импорт java.lang.annotation.ElementType;импорт java.lang.annotation.Мұрагерлік;импорт java.lang.annotation.Сақтау;импорт java.lang.annotation.RetentionPolicy;импорт java.lang.annotation.Target;@ Құжатталған@Retention(Сақтау саясаты.RUNTIME)@Target({ElementType.ТҮРІ,ElementType.ӘДІС,         ElementType.ҚҰРЫЛЫС,ElementType.ANNOTATION_TYPE,         ElementType.ПАКЕТ,ElementType.ТАЛА,ElementType.LOCAL_VARIABLE})@ Мұрагерқоғамдық @interface Аяқталмаған {    қоғамдық енум Басымдық { ТӨМЕН, ОРТА, ЖОҒАРЫ }    Жол мәні();    Жол[] өзгерді() әдепкі "";    Жол[] lastChangedBy() әдепкі "";    Басымдық басымдық() әдепкі Басымдық.ОРТА;    Жол жасалған() әдепкі «Джеймс Гослинг»;    Жол lastChanged() әдепкі "2011-07-08";}
пакет комнот;қоғамдық @interface Реконструкцияда {    Жол иесі() әдепкі «Патрик Ноттон»;    Жол мәні() әдепкі «Нысан салынуда».;    Жол жасалған() әдепкі «Майк Шеридан»;    Жол lastChanged() әдепкі "2011-07-08";}
пакет com.validators;импорт javax.faces.application.FacesMessage;импорт javax.faces.component.UIComponent;импорт javax.faces.context.FacesContext;импорт javax.faces.validator.Validator;импорт javax.faces.validator.ValidatorException;импорт com.annotation.UnderC Construction;импорт ком.қосымша.аяқталмаған;импорт ком.қосымша.аяқталмаған.приоритет;импорт com.util.Util;@Реконструкцияда(иесі=«Джон До»)қоғамдық сынып DateValidator құрал-саймандар Валидатор {	    қоғамдық жарамсыз растау(FacesContext контекст, UICкомпонент компонент, Нысан мәні)        лақтырады ValidatorException {        Жол күн = (Жол) мәні;        Жол errorLabel = «Жарамды күнді енгізіңіз.»;        егер (!компонент.getAttributes().isEmpty()) {            errorLabel = (Жол) компонент.getAttributes().алу(«қате ойнату»);        }        егер (!Util.validateAGivenDate(күн)) {            @ Аяқталмаған(өзгерді = «Стив»,                мәні = «контекстке хабарлама қосу керек пе, жоқ па, растаңыз»,                басымдық = Басымдық.ЖОҒАРЫ            )            FacesMessage хабар = жаңа FacesMessage();            хабар.setSeverity(FacesMessage.SEVERITY_ERROR);            хабар.setSummary(errorLabel);            хабар.setDetail(errorLabel);            лақтыру жаңа ValidatorException(хабар);        }    }}

Өңдеу

Java бастапқы коды құрастырылған кезде аннотацияларды аннотация процессорлары деп аталатын компилятор плагиндерімен өңдеуге болады. Процессорлар ақпараттық хабарламалар шығара алады немесе қосымша Java бастапқы файлдарын немесе ресурстарын құра алады, олар өз кезегінде құрастырылуы және өңделуі мүмкін. Алайда, аннотация процессорлары түсіндірме кодты өзі өзгерте алмайды. (Код модификациясын Java тілінің спецификациясынан тыс әдістерді қолдану арқылы жүзеге асыруға болады.) Java компиляторы шартты түрде аннотация метадеректерін класс файлдарында сақтайды, егер аннотацияда Сақтау саясаты туралы СЫНЫП немесе RUNTIME. Кейінірек JVM немесе басқа бағдарламалар метамәліметтерді бағдарлама элементтерімен өзара әрекеттесуді немесе олардың мінез-құлқын өзгертуді анықтау үшін іздей алады.

Аннотацияны процессордың көмегімен аннотацияны өңдеуден басқа, Java бағдарламашысы аннотацияны өңдеу үшін көріністерді қолданатын жеке кодын жаза алады. Java SE 5 анықталған жаңа интерфейсті қолдайды java.lang.reflect пакет. Бұл пакетте деп аталатын интерфейс бар Түсіндірме элемент соның ішінде Java рефлексия сыныптары жүзеге асырады Сынып, Конструктор, Өріс, Әдіс, және Пакет. Бұл интерфейстің бағдарламалары Java виртуалды машинасында жұмыс істеп тұрған бағдарламаның түсіндірме элементін ұсыну үшін қолданылады. Бұл интерфейс аннотацияларды рефлексиялық түрде оқуға мүмкіндік береді.

The Түсіндірме элемент интерфейс аннотацияға қол жеткізуді қамтамасыз етеді RUNTIME ұстау. Бұл қол жетімділік getAnnotation, getAnnotations, және isAnnotationPresent әдістер. Аннотация типтері кластар сияқты байт-кодтық файлдарда жинақталатындықтан және сақталатындықтан, осы әдістермен қайтарылған аннотацияларды кез-келген кәдімгі Java объектілері сияқты сұрауға болады. Аннотацияны өңдеудің толық мысалы төменде келтірілген:

импорт java.lang.annotation.Сақтау;импорт java.lang.annotation.RetentionPolicy;// Бұл өңделетін аннотация// Мақсат бойынша әдепкі - бұл барлық Java элементтері// Сақтау саясатын RUNTIME етіп өзгертіңіз (әдепкі бойынша СЫНЫП)@Retention(Сақтау саясаты.RUNTIME)қоғамдық @interface TypeHeader {    // Әзірлеуші ​​төлсипаты үшін көрсетілген әдепкі мән    Жол әзірлеуші() әдепкі «Белгісіз»;    Жол lastModified();    Жол [] команда мүшелері();    int Өмірдің мәні();}
// Бұл аннотация сыныпқа қолданылады@TypeHeader(әзірлеуші = «Боб Би»,    lastModified = "2013-02-12",    команда мүшелері = { «Энн», «Дэн», «Фран» },    Өмірдің мәні = 42)қоғамдық сынып SetCustomAnnotation {    // Сынып мазмұны осында}
// Бұл аннотацияны өңдейтін мысал кодимпорт java.lang.annotation.Annotation;импорт java.lang.reflect.AnnotatedElement;қоғамдық сынып UseCustomAnnotation {    қоғамдық статикалық жарамсыз негізгі(Жол [] доға) {        Сынып<SetCustomAnnotation> classObject = SetCustomAnnotation.сынып;        оқуТүсіндірме(classObject);    }    статикалық жарамсыз оқуТүсіндірме(Түсіндірме элемент элемент) {        тырысу {            Жүйе.шығу.println(«Аннотация элементінің мәндері:  n»);            егер (элемент.isAnnotationPresent(TypeHeader.сынып)) {                // getAnnotation Аннотация түрін қайтарады                Аннотация жалғызАннотация =                         элемент.getAnnotation(TypeHeader.сынып);                TypeHeader тақырып = (TypeHeader) жалғызАннотация;                Жүйе.шығу.println(«Әзірлеуші:» + тақырып.әзірлеуші());                Жүйе.шығу.println(«Соңғы өзгертулер:» + тақырып.lastModified());                // teamMembers String ретінде оралды []                Жүйе.шығу.басып шығару(«Топ мүшелері:»);                үшін (Жол мүше : тақырып.команда мүшелері())                    Жүйе.шығу.басып шығару(мүше + ", ");                Жүйе.шығу.басып шығару(« n»);                Жүйе.шығу.println(«Өмірдің мәні:»+ тақырып.Өмірдің мәні());            }        } аулау (Ерекше жағдай ерекшелік) {            ерекшелік.printStackTrace();        }    }}

Табиғатта пайдалану

Зерттеушілер Java аннотацияларының қолданылуын GitHub-та орналастырылған 1094 танымал ашық бастапқы кодты Java жобалары бойынша зерттеді. Олар аннотациялар белсенді түрде жүргізілетіндігін, көптеген аннотациялар қосылатындығын, сонымен қатар аннотация түріндегі немесе мәндеріндегі қателіктерге байланысты өзгертілетін немесе жойылатынын анықтады. Жалпы алғанда, бұл зерттеу аннотацияны қолдану мен кодтың қателікке бейімділігі арасында аз, бірақ маңызды байланыс бар екенін анықтады: аннотациясы бар Java коды қатеге аз ұшырайды.[7]

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ «Аннотациялар». Sun Microsystems. Архивтелген түпнұсқа 2011-09-25. Алынған 2011-09-30..
  2. ^ Sun Microsystems (2005). Java (TM) тіл ерекшеліктері (3-ші басылым). Prentice Hall. ISBN  0-321-24678-0..
  3. ^ Даре Обасанжо (2007). «MICROSOFT's C # SUN MICROSYSTEMS 'JAVA PROGRAMMING LANGUAGE OF SUN MICROSYSTEMS' JAVA PROGRAMMING LANGUAGE: Metadata Annotations». Дархан Обасанжо. Архивтелген түпнұсқа 2012-09-19. Алынған 2012-09-20.
  4. ^ Қорқақ, Дэнни (2006-11-02). «JSR 175: JavaTM бағдарламалау тіліне арналған метадеректер құралы». Java қауымдастық процесі. Алынған 2008-03-05.
  5. ^ «Аннотацияның алдын-ала анықталған түрлері». Oracle корпорациясы. Алынған 2016-12-17.
  6. ^ «Кіріктірілген аннотациялар: стандартты түсіндірмелер». Алынған 2016-12-17.
  7. ^ Ю, Чжунсин; Бай, Ченгган; Сентюрье, Лионель; Монперрус, Мартин (2019). «Java аннотацияларының тәжірибеде қолданылуын, эволюциясын және әсерін сипаттау». Бағдарламалық жасақтама бойынша IEEE транзакциялары. arXiv:1805.01965. дои:10.1109 / TSE.2019.2910516.

Сыртқы сілтемелер